Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据优化_Python_Numpy_Scipy - Fatal编程技术网

Python 数据优化

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

我有一些猜测的输入数据(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    

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”并将其返回到任何标量时,它起作用了,我得到了相同的结果。当然,我只是凭直觉最小化了函数之间的关系。如果他们的关系是非线性的,那就更有必要了。但是你所有的函数都是线性函数,所以你可以返回它们的值之和,并最小化它们。我只是想说明一下你能概括非线性情况的一般想法;}