【发布时间】: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