Минимизируйте две переменные с помощью scipy optimize

Я хочу установить две скорости обучения (альфа): одну для первой половины данных и одну для второй половины данных. Мне удалось сделать это всего за одно обучение, но я сталкиваюсь с ошибками при попытке уместить два.

Эти функции работают при минимизации одной переменной:

optimize.fminbound(sse_f,0,1)

minimize_scalar(sse_f, bounds=(0,1), method='bounded')

Я не уверен, могу ли я использовать fminbound / minim_scalar или мне следует использовать minim () для двух скоростей обучения (альфа).

Моя функция выглядит примерно так: я удалил несколько строк для простоты, но в основном я хочу минимизировать SSE для первой половины данных и второй половины отдельно.

def sse_f(a_1,a_2):
    data = []
    for _, row in temp.iterrows():
        alpha = a_1 #for first 120 rows use one alpha
        if row['trial_nr'] == 120: #for rows after 120 use second alpha
            alpha = a_2
        #calculate diff variables removed for simplicity 
        data.append([phase,pi,abs_PE])
    col = ['phase','abs_PE','congruency']
    df_ = pd.DataFrame(data, columns= col)
    df_a = df[(df['phase']=='a')]
    df_b =  df[(df['phase']=='b')]

    x = np.array(df_a[['congruency','abs_PE']]) #run linear regression for first half
    y = df_a['RT'] 
    sse_a = lin_reg(x,y)

    x_b = np.array(df_b[['congruency','abs_PE']]) #run linear regression for second half
    y_b = df_b['RT'] 
    sse_b = lin_reg(x_b,y_b) #calculate SSE
    return sse_a,sse_b #return SSE for first half and second half of data

Результатом этой функции будет кортеж, например:

sse_f(.43,.43)
(54487466.6875101, 17251575.11206138)

Если я использую минимизацию (), я получаю эту ошибку:

minimize(sse_f, x0=(0,0), bounds=[(0,0),(1,1)])

TypeError: sse_f() missing 1 required positional argument: 'a_2'

И если я использую minim_scalar (), я получаю эту ошибку:

ValueError: Optimisation bounds must be scalars or array scalars.

Будем очень признательны за любые указания относительно того, как подогнать две альфы или почему я получаю эти ошибки!


person beni    schedule 29.12.2020    source источник
comment
x0 - это двухэлементный кортеж. Это то, что minimize передаст вашей функции (как массив), а затем изменится в последующих вызовах. Внимательно прочтите документацию и точно следуйте ей.   -  person hpaulj    schedule 29.12.2020


Ответы (1)


Я только что изменил определение вашей функции, чтобы список кортежей отдавался индивидуально для alpha1 и alpha2. Я хотел протестировать, но не знаю, что такое переменная temp. Но я думаю, что список теперь помещен в следующие переменные [минимум (альфа1, альфа2), максимум ((альфа1, альфа2)].

def sse_f(a):
    a_1=a[0]
    a_2=a[1]
    data = []
    for _, row in temp.iterrows():
        alpha = a_1 #for first 120 rows use one alpha
        if row['trial_nr'] == 120: #for rows after 120 use second alpha
            alpha = a_2
        #calculate diff variables removed for simplicity 
        data.append([phase,pi,abs_PE])
    col = ['phase','abs_PE','congruency']
    df_ = pd.DataFrame(data, columns= col)
    df_a = df[(df['phase']=='a')]
    df_b =  df[(df['phase']=='b')]

    x = np.array(df_a[['congruency','abs_PE']]) #run linear regression for first half
    y = df_a['RT'] 
    sse_a = lin_reg(x,y)

    x_b = np.array(df_b[['congruency','abs_PE']]) #run linear regression for second half
    y_b = df_b['RT'] 
    sse_b = lin_reg(x_b,y_b) #calculate SSE
    return sse_a,sse_b #return SSE for first half and second half of data

Сообщите мне, помогло ли это.

person Andreas B    schedule 29.12.2020