用最小方差约束求解线性方程组

2024-03-29 10:08:50 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有给定的矩阵A(mxn)、B(nx1)和C(mx1)

我们要求X,使点X=C,约束条件是X与B的方差最小,即min((X-B)^2)

有没有python包可以很好地解决这类问题?矩阵B也可能很大,有数千个条目。在


Tags: 条目矩阵min方差约束条件mxnnx1mx1
1条回答
网友
1楼 · 发布于 2024-03-29 10:08:50

下面是一个使用cvxpy的解决方案。在

记住,你有两个竞争的目标!这意味着,你要么要平衡这些(哪一个有多重要),要么将其中一个作为固定约束(例如方差差小于某个给定常数)。这里有一些关于前者的代码。在

另一个备注:虽然您最初的方差项是平方和,但我在这里使用的是欧几里德范数,这对于解决(niceSOCP问题公式)更好,而且在使用alpha平衡时可能也更有趣,因为两者增长相同(渐近)。在

使用的默认解算器是ECOS(开源)。在

代码

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)

输出alpha=0.1->;与A*X=C

^{pr2}$

输出alpha=10->;与A*X=C

5.3146149509187195
A*X:  [[ 1.87714559  2.11056115  1.74268386  1.68503155  2.59590194  
1.9540973 2.37874233  2.07600857  1.6713983   1.2590621 ]]
C:  [ 0.18125564  0.33469345  0.63367096  0.0075308   0.19983206  0.76975212
  0.22084296  0.35758024  0.0214036   0.42501635]
X:  [[ 0.25227884  0.4022509   0.17074389  0.22068181  0.04595178 0.85354537
   0.1039422   0.76882144  0.85936741  0.14723398]]
B:  [ 0.25227884  0.4022509   0.17074389  0.22068181  0.04595178  0.85354537
  0.1039422   0.76882144  0.85936741  0.14723398]

在我的机器上,一个随机的稠密的1000x1000问题用了15秒(商业求解器MOSEK将在~1秒内完成)。{a4可以稍微降低一个GPU模式下的精度。在

如果问题稀疏,两个解算器都可以获得很多。在

相关问题 更多 >