如何设置目标参数来用scipy.optimize求解多目标问题?

ykejflvf  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(163)

我花了几个小时试图让我的头周围的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。这个多边形正在转换一些东西,然后与一组“已知”数据进行比较,看看估计有多好,循环并重复,希望得到一个优化的多项式。
也许我缺少约束。我不知道如何使用它们。
在matlab中,像fgoalattain这样的函数可以在优化过程中获取目标值和权重值。
我希望得到斜率:1,r2:1,截距:0,或者尽可能接近。但是,我不知道该使用函数中的哪些选项,或者我是否使用了错误的方法或其他东西。我没有在文档中看到任何关于目标实现的内容。
代码基本上试图使y =0,并将线性趋势向下移动,而不是1:1
我试过xtol,jac=True和其他一些,返回斜率,截距,r2,但我似乎不能让它工作。

mznpcxlj

mznpcxlj1#

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))

除了可以在least_squares中使用的普通平方和函数外,还有其他loss函数:见文档。

相关问题