gpt4 book ai didi

python - 当我尝试使用 for 循环设置约束时,Scipy Optimization 未运行

转载 作者:行者123 更新时间:2023-11-30 22:32:22 27 4
gpt4 key购买 nike

我试图最小化目标函数,同时使用 for 循环设置约束,使得 x1 = x2 = ... xn。然而,优化似乎并没有起到作用。 IE。结束x仍然等于初始x。我收到一条错误消息“LSQ 子问题中的奇异矩阵 C”。

covariance_matrix = np.matrix([[0.159775519, 0.022286316, 0.00137635, -0.001861736],
[0.022286316, 0.180593862, -5.5578e-05, 0.00451056],
[0.00137635, -5.5578e-05, 0.053093075, 0.02240866],
[-0.001861736, 0.00451056, 0.02240866, 0.053778594]])

x0 = np.matrix([0.2,0.2,0.3,0.4])


fun = lambda x: x.dot(covariance_matrix).dot(x.transpose())
cons = np.array([])
for i in range(0,x0.size-1):
con = {'type': 'eq', 'fun': lambda x: x[i] - x[i+1]}
cons = np.append(cons, con)

con = {'type': 'eq', 'fun': lambda x: sum(x)-1}
cons = np.append(cons, con)

solution = minimize(fun,x0,method='SLSQP',constraints = cons)


solution message: Singular matrix C in LSQ subproblem
solution status: 6
solution success: False

但是如果我一一附加约束,那么它就可以完美工作,这意味着结果给出 x1 = x2 = x3 = x4

con1 = {'type': 'eq', 'fun': lambda x:  sum(x)-1}   
con2 = {'type': 'eq', 'fun': lambda x: x[1]-x[0]}
con3 = {'type': 'eq', 'fun': lambda x: x[2]-x[1]}
con4 = {'type': 'eq', 'fun': lambda x: x[3]-x[2]}
cons = np.append(cons, con1)
cons = np.append(cons, con2)
cons = np.append(cons, con3)
cons = np.append(cons, con4)

solution message: Optimization terminated successfully.
solution status: 0
solution success: True

最佳答案

(注:虽然细节不同,但这个问题与 Scipy.optimize.minimize SLSQP with linear constraints fails 是同一个问题)

你的循环是

for i in range(0,x0.size-1):
con = {'type': 'eq', 'fun': lambda x: x[i] - x[i+1]}
cons = np.append(cons, con)

问题在于 lambda 表达式中使用了 iPython closures are "late binding" 。这意味着调用函数时使用的 i 值与创建函数时的 i 值不同。循环结束后,i 的值为 2,因此循环中创建的所有函数计算的表达式为 x[2] - x[3]。 (这也解释了错误消息中提到的“奇异矩阵 C”。)

解决此问题的一种方法是使 i 成为 lambda 表达式的参数,其默认值为当前 i:

    con = {'type': 'eq', 'fun': lambda x, i=i:  x[i] - x[i+1]}

关于python - 当我尝试使用 for 循环设置约束时,Scipy Optimization 未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45491376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com