【问题标题】:Minimize two variables with scipy optimize使用 scipy 优化最小化两个变量
【发布时间】:2021-04-05 19:54:13
【问题描述】:

我想拟合两种学习率 (alpha),一种用于数据的前半部分,另一种用于数据的后半部分。我只需要一次学习就可以做到这一点,但在尝试适合两次学习时却遇到了错误。

这些函数在最小化一个变量时起作用:

optimize.fminbound(sse_f,0,1)

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

我不确定是否可以使用 fminbound/minimize_scalar 或者是否应该将 minimize() 用于两个学习率 (alpha)。

我的函数看起来像这样,为简单起见,我删除了几行,但基本上,我想分别最小化前半部分数据和后半部分的 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'

如果我使用 minimize_scalar() 我得到这个错误:

ValueError: Optimisation bounds must be scalars or array scalars.

任何关于如何拟合两个 alpha 或我为什么会出现这些错误的指针将不胜感激!

【问题讨论】:

  • x0 是一个 2 元素元组。这就是minimize 将传递给您的函数(作为数组)的内容,然后在后续调用中发生变化。仔细阅读文档并严格遵守。

标签: python scipy scipy-optimize scipy-optimize-minimize


【解决方案1】:

我刚刚更改了您的函数定义,以便将元组列表分别提供给 alpha1 和 alpha2。我想测试,但我不知道变量 temp 是什么。但我认为现在将列表放入如下变量中 [minimum(alpha1 , alpha2),maximum((alpha1 , alpha2)]。

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

如果有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2018-03-17
    • 2019-12-21
    • 2018-02-16
    相关资源
    最近更新 更多