如何设置目标参数以使用scipy.optimize解决多目标问题?

时间:2018-08-29 02:51:52

标签: python optimization scipy minimize

我花了几个小时试图绕过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,但我似乎无法使其正常工作。

1 个答案:

答案 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个函数:请参见文档。