import numpy as np
from cvxpy import *
""" Random data """
M = 10
N = 10
A = np.random.rand(M,N)
B = np.random.rand(N)
C = np.random.rand(M)
""" Solve """
alpha = 0.01 # Regularization
factor -> multiple objectives
X = Variable(B.shape[0])
component_A, component_B = norm(A * X - C), norm(X - B) # norm more useful than sum_of_squares
objective = Minimize(component_A + alpha * component_B)
problem = Problem(objective, []) # [] = no constraints
problem.solve(verbose=False)
print(problem.value)
print('A*X: ', A.dot(X.value).T.flatten())
print('C: ', C)
print('X: ', X.value.T.flatten())
print('B: ', B)
下面是一个使用cvxpy的解决方案。在
记住,你有两个竞争的目标!这意味着,你要么要平衡这些(哪一个有多重要),要么将其中一个作为固定约束(例如方差差小于某个给定常数)。这里有一些关于前者的代码。在
另一个备注:虽然您最初的方差项是平方和,但我在这里使用的是欧几里德范数,这对于解决(niceSOCP问题公式)更好,而且在使用alpha平衡时可能也更有趣,因为两者增长相同(渐近)。在
使用的默认解算器是ECOS(开源)。在
代码
输出alpha=0.1->;与A*X=C
^{pr2}$输出alpha=10->;与A*X=C
在我的机器上,一个随机的稠密的1000x1000问题用了15秒(商业求解器MOSEK将在~1秒内完成)。{a4可以稍微降低一个GPU模式下的精度。在
如果问题稀疏,两个解算器都可以获得很多。在
相关问题 更多 >
编程相关推荐