如何解决使用 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 举报,一经查实,本站将立刻删除。