微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 scipy 优化最小化两个变量

如何解决使用 scipy 优化最小化两个变量

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

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

optimize.fminbound(sse_f,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() 我得到这个错误

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

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

如果我使用 minimum_scalar() 我会收到这个错误

ValueError: Optimisation bounds must be scalars or array scalars.

任何关于如何适应两个 alpha 或我为什么会收到这些错误的指示将不胜感激!

解决方法

我刚刚更改了您的函数定义,以便将元组列表分别提供给 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

如果有帮助,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。