CVXPY,最小二乘优化,错误的约束公式
CVXPY, least-squares Optimization, wrong constraint formulation
首先,如果我的问题没有意义,我很抱歉,我是 CVXPY 库的新手,我不是很明白:/
我正在尝试解决一个我认为很容易处理的最小化问题。
我得到了一个已知系数的 S 维 (9,7) 矩阵,已知系数的 B 维 (1,7),Alpha 维 (1,7) 我需要找到的,具有各种约束:
- Alpha 必须为正数
- Alpha所有系数之和必须等于1
我需要优化 Alpha,例如:A @ Alpha-B=0。
我发现了 CVXPY 并认为最小二乘优化非常适合这个问题。
这是我写的代码:
Alpha = cp.Variable(7)
objective = cp.Minimize(cp.sum_squares(S @ Alpha - B))
constraints = [0 <= Alpha, Alpha<=1, np.sum(Alpha.value)==1]
prob = cp.Problem(objective, constraints)
result = prob.solve()
print(Alpha.value)
有
S= np.array([[0.03,0.02,0.072,0.051,0.058,0.0495,0.021 ],
[0.0295, 0.025 , 0.1 , 0.045 , 0.064 , 0.055 , 0.032 ],
[0.02 , 0.018 , 0.16 , 0.032 , 0.054 , 0.064 , 0.025 ],
[0.0195, 0.03 , 0.144 , 0.027 , 0.04 , 0.06 , 0.04 ],
[0.02 , 0.0315, 0.156 , 0.0295 ,0.027 , 0.0615 ,0.05 ],
[0.021 , 0.033 , 0.168 , 0.03 , 0.0265 ,0.063 , 0.09 ],
[0.02 , 0.05 , 0.28 , 0.039 , 0.035 , 0.055 , 0.04 ],
[0.021 , 0.03 , 0.22 , 0.0305, 0.0255, 0.057 , 0.009 ],
[0.0195, 0.008 , 0.2 , 0.021 , 0.01 , 0.048 , 0.0495]])
B=np.array([0.1015, 0.0888, 0.0911, 0.0901, 0.0945, 0.0909, 0.078 , 0.0913,
0.0845])
我的问题如下:
- 没有约束np.sum(Alpha.value)==1,代码给了我结果;但是当我添加约束时 returns me
None
我觉得这个表述不太好,但是我不知道怎么换一种方式来写呢?
或者也许问题没有解决方案?
谢谢你的时间
仅使用 sum(Alpha) == 1
。您不应该在 CVXPY 表达式中使用 numpy
函数,您必须使用 https://www.cvxpy.org/tutorial/functions/index.html
中列出的 CVXPY 函数
首先,如果我的问题没有意义,我很抱歉,我是 CVXPY 库的新手,我不是很明白:/
我正在尝试解决一个我认为很容易处理的最小化问题。 我得到了一个已知系数的 S 维 (9,7) 矩阵,已知系数的 B 维 (1,7),Alpha 维 (1,7) 我需要找到的,具有各种约束:
- Alpha 必须为正数
- Alpha所有系数之和必须等于1
我需要优化 Alpha,例如:A @ Alpha-B=0。 我发现了 CVXPY 并认为最小二乘优化非常适合这个问题。
这是我写的代码:
Alpha = cp.Variable(7)
objective = cp.Minimize(cp.sum_squares(S @ Alpha - B))
constraints = [0 <= Alpha, Alpha<=1, np.sum(Alpha.value)==1]
prob = cp.Problem(objective, constraints)
result = prob.solve()
print(Alpha.value)
有
S= np.array([[0.03,0.02,0.072,0.051,0.058,0.0495,0.021 ],
[0.0295, 0.025 , 0.1 , 0.045 , 0.064 , 0.055 , 0.032 ],
[0.02 , 0.018 , 0.16 , 0.032 , 0.054 , 0.064 , 0.025 ],
[0.0195, 0.03 , 0.144 , 0.027 , 0.04 , 0.06 , 0.04 ],
[0.02 , 0.0315, 0.156 , 0.0295 ,0.027 , 0.0615 ,0.05 ],
[0.021 , 0.033 , 0.168 , 0.03 , 0.0265 ,0.063 , 0.09 ],
[0.02 , 0.05 , 0.28 , 0.039 , 0.035 , 0.055 , 0.04 ],
[0.021 , 0.03 , 0.22 , 0.0305, 0.0255, 0.057 , 0.009 ],
[0.0195, 0.008 , 0.2 , 0.021 , 0.01 , 0.048 , 0.0495]])
B=np.array([0.1015, 0.0888, 0.0911, 0.0901, 0.0945, 0.0909, 0.078 , 0.0913,
0.0845])
我的问题如下:
- 没有约束np.sum(Alpha.value)==1,代码给了我结果;但是当我添加约束时 returns me
None
我觉得这个表述不太好,但是我不知道怎么换一种方式来写呢? 或者也许问题没有解决方案? 谢谢你的时间
仅使用 sum(Alpha) == 1
。您不应该在 CVXPY 表达式中使用 numpy
函数,您必须使用 https://www.cvxpy.org/tutorial/functions/index.html