0

例如

from scipy.optimize import differential_evolution
import numpy as np

def func(parameters, *data):

    a,b,c = parameters
    x,y = data

    result = (a*x**2 + b*x+ c - y)**2

    return sum(result)

bounds = [(0.5, 1), (0.5, 1), (0.5, 1)]
x = np.array([1,2,3,4,5])
y = np.array([1,4,9,16,25])
args = (x,y)

parameters = differential_evolution(func, bounds, args=args,seed=np.random.seed(7))
print(parameters.x)

那么 a, b, c = [0.85699693 0.5 0.5]

现在,如果有人想强制c 必须大于a,即c>a 用于参数拟合结果。我怎么能做到这一点?

我自己的解决方案是对定义的函数使用条件返回,所以替换return sum(result)return sum(result) if c>a else np.Inf. 这给了我一组新的 a, b, c = [0.83454878 0.50031474 0.83487768]

4

2 回答 2

0
from scipy.optimize import differential_evolution
import numpy as np

def func(parameters, *data):

a,b,c = parameters
x,y = data

result = (a*x**2 + b*x+ c - y)**2

return sum(result) if c>a else np.Inf

bounds = [(0.5, 1), (0.5, 1), (0.5, 1)]
x = np.array([1,2,3,4,5])
y = np.array([1,4,9,16,25])
args = (x,y)

parameters = differential_evolution(func, bounds, args=args,seed=np.random.seed(7))
print(parameters.x)

[0.83454878 0.50031474 0.83487768]

于 2020-08-01T13:29:16.773 回答
0

一个更好的方法是使用约束。在这种情况下,一个LinearConstraint. 您要使用的约束是c - a > 0。这个解决方案类似于 Warren 的建议。

from scipy.optimize import differential_evolution
from scipy.optimize import LinearConstraint
import numpy as np

def func(parameters, *data):

    a,b,c = parameters
    x,y = data

    result = (a*x**2 + b*x+ c - y)**2

    return sum(result)

bounds = [(0.5, 1), (0.5, 1), (0.5, 1)]
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 4, 9, 16, 25])
args = (x, y)

lc = LinearConstraint(np.array([-1, 0, 1]), [0], [np.inf])
parameters = differential_evolution(func, bounds, args=args, seed=np.random.seed(7), constraints=(lc,))
print(parameters.x, parameters.x[2] > parameters.x[0])

[0.83546612 0.50000016 0.83546635] True

于 2021-01-05T04:28:07.070 回答