使用'COBYLA'算法使用python约束最小二乘不等式

时间:2017-11-08 15:56:22

标签: python numpy optimization scipy

我的目标是最小化最小二乘(即“拟合”函数),使返回的函数不递减,这意味着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)

优化过程的结果是我的第二个实验。结果函数,如果你绘制它看起来像这样。

enter image description here

正如您所看到的,即使没有任何约束,结果函数也非常适合我的数据。我看到数据的类似行为,我也需要一些约束,有时结果函数事件比这个例子更糟糕。所以我的第二个问题是:

2]任何人都能解释我,我做错了吗?

0 个答案:

没有答案