Python 数据优化
我有一些猜测的输入数据(X0),我想在多个函数中优化它们,如下所述 X0=[A,B,C,D,E,F,G,H,I,J,K]#每个元素都是一个浮点值 职能: F1=A+B+C+D-200=0 F2=C+D+E-50=0 F3=C+D+E+F+G-45=0 F4=E+F+G+H+I+J+K-67=0 F5=H+I+J+K-64=0 我不确定scipy如何在多个函数中优化输入数据。 我准备了下面的脚本;我不确定它是否有反应Python 数据优化,python,numpy,scipy,Python,Numpy,Scipy,我有一些猜测的输入数据(X0),我想在多个函数中优化它们,如下所述 X0=[A,B,C,D,E,F,G,H,I,J,K]#每个元素都是一个浮点值 职能: F1=A+B+C+D-200=0 F2=C+D+E-50=0 F3=C+D+E+F+G-45=0 F4=E+F+G+H+I+J+K-67=0 F5=H+I+J+K-64=0 我不确定scipy如何在多个函数中优化输入数据。 我准备了下面的脚本;我不确定它是否有反应 from scipy.optimize import minimize
from scipy.optimize import minimize
x0 = np.array([1. for i in range(11)])
def my_function(A, B, C, D, E, F, G, H, I, J, K):
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
cons = ({'type': 'ineq', 'my_function': lambda A, B, C, D: A + B + C + D - 200},
{'type': 'ineq', 'my_function': lambda C, D, E: C + D + E - 50},
{'type': 'ineq', 'my_function': lambda C, D, E, F, G: C + D + E + F + G - 45},
{'type': 'ineq', 'my_function': lambda E, F, G, H, I, J, K: E + F + G + H + I + J + K - 67},
{'type': 'ineq', 'my_function': lambda H, I, J, K: H + I + J + K - 64})
res = minimize(my_function, x0, method='BFGS', constraints=cons )
你很接近。使用类型
eq
(相等)而不是不等。此外,您的约束应该只接收一个参数,即值数组,您只需访问它们的位置
检查以下各项:
from scipy.optimize import minimize
x0 = np.random.random(size=[11])
def my_function(X):
A, B, C, D, E, F, G, H, I, J, K = X
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
cons = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
{'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
{'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})
res = minimize(my_function, x0, constraints=cons)
返回
success: True
x: array([79.27328348, 78.72671652, 21.16500123, 20.83499877, 8. ,
-2.5794818 , -2.4205182 , 15.7738023 , 16.59847106, 15.92703282,
15.70069382])
你很接近。使用类型
eq
(相等)而不是不等。此外,您的约束应该只接收一个参数,即值数组,您只需访问它们的位置
检查以下各项:
from scipy.optimize import minimize
x0 = np.random.random(size=[11])
def my_function(X):
A, B, C, D, E, F, G, H, I, J, K = X
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
cons = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
{'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
{'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})
res = minimize(my_function, x0, constraints=cons)
返回
success: True
x: array([79.27328348, 78.72671652, 21.16500123, 20.83499877, 8. ,
-2.5794818 , -2.4205182 , 15.7738023 , 16.59847106, 15.92703282,
15.70069382])
在下面的脚本中,我希望在整个循环表单(cons2)中生成约束,但是循环输出的结果与我使用的非循环表单(cons2)不同。我希望两者都能得到同样的结果
from scipy.optimize import minimize
import numpy as np
np.random.seed(15)
x0 = np.random.random(size=[11])
def my_function(X):
A, B, C, D, E, F, G, H, I, J, K = X
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
#the constraints without loop
cons1 = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
{'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
{'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})
data = [200, 50, 45, 67, 64]
ran = [[0,3], [2,4], [2,6], [4,10], [7,10]]
_tmp= []
#the constraints with loop
for hh in range(5):
_tmp.append({'type': 'eq', 'fun': lambda X: sum([X[i] for i in range(ran[hh][0], ran[hh][1]+1)]) - data[hh]})
cons2 = tuple(_tmp)
#the outputs below must be the same, but it's not.
res1 = minimize(my_function, x0, constraints=cons1)
res2 = minimize(my_function, x0, constraints=cons2)
print res1.x
print res2.x
在下面的脚本中,我希望在整个循环表单(cons2)中生成约束,但是循环输出的结果与我使用的非循环表单(cons2)不同。我希望两者都能得到同样的结果
from scipy.optimize import minimize
import numpy as np
np.random.seed(15)
x0 = np.random.random(size=[11])
def my_function(X):
A, B, C, D, E, F, G, H, I, J, K = X
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
#the constraints without loop
cons1 = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] + X[2] + X[3] - 200},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] - 50},
{'type': 'eq', 'fun': lambda X: X[2] + X[3] + X[4] + X[5] + X[6] - 45},
{'type': 'eq', 'fun': lambda X: X[4] + X[5] + X[6] + X[7] + X[8] + X[9] + X[10] - 67},
{'type': 'eq', 'fun': lambda X: X[7] + X[8] + X[9] + X[10] - 64})
data = [200, 50, 45, 67, 64]
ran = [[0,3], [2,4], [2,6], [4,10], [7,10]]
_tmp= []
#the constraints with loop
for hh in range(5):
_tmp.append({'type': 'eq', 'fun': lambda X: sum([X[i] for i in range(ran[hh][0], ran[hh][1]+1)]) - data[hh]})
cons2 = tuple(_tmp)
#the outputs below must be the same, but it's not.
res1 = minimize(my_function, x0, constraints=cons1)
res2 = minimize(my_function, x0, constraints=cons2)
print res1.x
print res2.x
创建一个函数
def my_function
,其中函数的参数为a
,B
,C
<代码>K。然后,对F
的所有值求和,即此函数将返回F1
+F2
+..+F5
。这是你现在的目标函数。然后在此函数上使用scipy.optmize.minimize
将具有任意值的N
元素数组作为初始值传递,就完成了。唯一的细节是传递约束。约束是5个lambda函数,它们是您的5个F
sI编写的上述脚本;但我不确定这是否正确。你们很接近。刚刚发布了一个代码修复程序,请看:}谢谢您的帮助。它起作用了。一个问题:我可以只在约束中导入函数吗?因为当我把函数从我的函数(X)中排除,只剩下“A,B,C,D,E,F,G,H,I,J,K=X”并将其返回到任何标量时,它起作用了,我得到了相同的结果。当然,我只是凭直觉最小化了函数之间的关系。如果他们的关系是非线性的,那就更有必要了。但是你所有的函数都是线性函数,所以你可以返回它们的值之和,并最小化它们。我只是想说明一下你能概括非线性情况的一般想法;}创建一个函数def my_function
,其中函数的参数为a
,B
,C
<代码>K。然后,对F
的所有值求和,即此函数将返回F1
+F2
+..+F5
。这是你现在的目标函数。然后在此函数上使用scipy.optmize.minimize
将具有任意值的N
元素数组作为初始值传递,就完成了。唯一的细节是传递约束。约束是5个lambda函数,它们是您的5个F
sI编写的上述脚本;但我不确定这是否正确。你们很接近。刚刚发布了一个代码修复程序,请看:}谢谢您的帮助。它起作用了。一个问题:我可以只在约束中导入函数吗?因为当我把函数从我的函数(X)中排除,只剩下“A,B,C,D,E,F,G,H,I,J,K=X”并将其返回到任何标量时,它起作用了,我得到了相同的结果。当然,我只是凭直觉最小化了函数之间的关系。如果他们的关系是非线性的,那就更有必要了。但是你所有的函数都是线性函数,所以你可以返回它们的值之和,并最小化它们。我只是想说明一下你能概括非线性情况的一般想法;}