我的目标是最小化最小二乘(即“拟合”函数),使返回的函数不递减,这意味着I上所有点的导数都是> = 0。
我的选择函数是4次多项式函数,即
f(x) = a*x**4 + b*x**3 + c*x**2 + d*x + e
对于此任务,最好使用scipy.optimize.minimize
方法。我建立了非常强大的迭代算法,搜索我的“最小化”结果函数减少的点,并设置不等式约束。例如,如果在点x0中f(x)递减,则我的约束为:
4*a*x0**3 + 3*b*x0**2 + 2*c*x0 + d >= 0
对于我的一些数据,我成功地使用'SLSQP'优化方法和不等式约束,如here所述。它很奇怪,因为最小化状态的documentation,即:
“请注意,COBYLA仅支持不等式约束。”
所以我的第一个问题:1]第一个链接的教程错了吗?
即使它是正确的,看起来我不能将'SLSQP'用于另一个数据,因为最小化过程存在“不兼容的约束”问题。
现在我想使用'COBYLA算法',因为可能有一些点,其中f(x)正在减少。以下是示例代码:
#STACK
#[ 1.01766416e-04, 1.80575564e-06, -7.51840485e-03, -7.51828086e-03, 9.84985357e-01]
import numpy as np
from scipy.optimize import minimize
def ecdf(arr):
arr = np.array(arr)
F = [len(arr[arr<=t]) / len(arr) for t in arr]
return np.array(F)
def der(args_pol, point):
a, b, c, d, e = args_pol
return (4*a*point**3 + 3*b*point**2 + 2*c*point + d)
def least_sq(args_pol, x, y):
a, b, c, d, e = args_pol
return ((y-(a*x**4 + b*x**3 + c*x**2 + d*x + e))**2).sum()
var = np.array([ 6.8, 6.9, 7. , 7.4, 7.4, 7.5, 7.5, 7.6, 7.7, 7.8, 8. ,
8. , 8. ])
ec = ecdf(var)
tip = [0., 0., 0., 0., 0.]
const = []
opt = minimize(least_sq, tip, method = 'COBYLA', args = (var, ec),
constraints = const)
优化过程的结果是我的第二个实验。结果函数,如果你绘制它看起来像这样。
正如您所看到的,即使没有任何约束,结果函数也非常适合我的数据。我看到数据的类似行为,我也需要一些约束,有时结果函数事件比这个例子更糟糕。所以我的第二个问题是:
2]任何人都能解释我,我做错了吗?