我花了几个小时试图绕过scipy.optimize.minimize function.
我已经开始工作了
def poly_fun(coeffs,a,x):
predicted=10**np.polynomial.polynomial.polyval(np.log10(a),coeffs)
slope,intercept,r_value,p_value,std_err=scipy.stats.linregress(x,predicted)
return slope #intercept,r_value,p_value,std_err
res=minimize(poly_fun,x0=original_polynomial,args=(a,x),method='Nelder-Mead')
我的poly_fun中还有一个绘图功能,可以对正在发生的事情进行可视化。
基本上我想提高斜率和截距,而不是多项式的r2自动。该poly进行转换,然后将其与一组“已知”数据进行比较,以查看估计的效果如何,循环并重复以希望获得优化的多项式。
也许我缺少约束?我不知道如何使用它们。
在matlab中,诸如fgoalattain
之类的函数可以在优化过程中获得目标值和权重值。
我想让我的斜率:1,r2:1和intercept:0:或尽可能接近。 但是,我无法确定要在函数中使用哪些选项,或者我使用的方法或方法有误。在文档中我还没有看到关于目标实现的任何信息。
按原样的代码试图使y = 0基本上并使线性趋势展平至底部,而我想将其设为1:1
我尝试了xtol,jac = True和其他一些方法,返回了坡度,截距,r2,但我似乎无法使其正常工作。
答案 0 :(得分:2)
minimize
寻找给定(标量)目标函数的最小值。它不处理多目标问题。仅通过传递诸如(slope-1)**2 + (r_value-1)**2 + intercept**2
之类的单个目标函数,就可以将其用于多目标问题。
但是,在这种情况下,最好使用专用的最小化器least_squares
,并传入一个返回向量[slope-1, r_value-1, intercept]
的函数。如果您还想附加权重[w1, w2, w3]
,请返回
[w1, w2, w3] * [slope-1, r_value-1, intercept]
相反。因此,权重为3, 4, 5
为
def poly_fun(coeffs, a, x):
predicted = 10**np.polynomial.polynomial.polyval(np.log10(a), coeffs)
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, predicted)
return np.array([3, 4, 5]) * np.array([slope-1, r_value-1, intercept])
res = least_squares(poly_fun, x0=original_polynomial, args=(a, x))
除了可以在loss
中使用的普通平方和之外,还有其他least_squares
个函数:请参见文档。