我发现了一个link,其中举例说明了当线性方程组有无穷多个解时,Matlab mldivide
算子(\
)给出了“特殊”解。在
例如:
A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_pinv = pinv(A) * b
给出输出:
^{pr2}$解决方案是“特殊”的,因为解决方案c_mldivide
中的非零条目的数目等于rank(A)
(在本例中为2)。我在numpy中使用numpy.linalg.lstsq
尝试了相同的操作,这给了c_pinv
相同的结果。在
有没有一种方法可以在Python中实现c_mldivide
解决方案?在
还有一个非常相似的问题here,但我想“特殊”这个词的解释不够清楚。
Another question询问了mldivide
运算符的内部工作方式,但接受的答案似乎没有解决这个问题。在
编辑1:numpy
代码
In [149]: test_A = np.array([[1,2,0],[0,4,3]])
test_b = np.array([[8],[18]])
np.linalg.lstsq(test_A,test_b)
Out[149]:
(array([[ 0.918 ],
[ 3.541 ],
[ 1.2787]]), array([], dtype=float64), 2, array([ 5.2732, 1.4811]))
编辑2:使用scipy.optimize.nnls
In[189]:
from scipy.optimize import nnls
nnls(test_A,test_b)
Out[190]:
ValueError Traceback (most recent call last)
<ipython-input-165-19ed603bd86c> in <module>()
1 from scipy.optimize import nnls
2
----> 3 nnls(test_A,test_b)
C:\Users\abhishek\Anaconda\lib\site-packages\scipy\optimize\nnls.py in nnls(A, b)
43 raise ValueError("expected matrix")
44 if len(b.shape) != 1:
---> 45 raise ValueError("expected vector")
46
47 m, n = A.shape
ValueError: expected vector
非负最小二乘(^{} )是这个问题的一般解。如果所有可能的解决方案都包含负系数,则会失败:
在A·x=b的情况下
^{pr2}$将选择一个最小化L2的解决方案。这恰好不是我们要寻找的特定解决方案,但我们可以线性变换它以得到我们想要的。为了做到这一点,我们首先计算A的right null space,它表征了A·x=b的所有可能解的空间。我们可以使用rank-revealing QR decomposition:
^{3}$Z是一个向量(或者,在n-rnk(a)>;1的情况下,跨越a的子空间的一组基向量),使得a·Z=0:
换句话说,Z的列是与A中所有行正交的向量。这意味着对于任何解x'到A·x=b,那么x'=x+Z·c也必须是任意标度因子c的解。这意味着,通过选取适当的c值,我们可以将解中任何系数的n-rnk(A)设置为零。在
例如,假设要将最后一个系数的值设置为零:
更一般的情况是n-rnk(A)≤1则稍微复杂一些:
我们得到x'和Z:
现在为了使解向量中的零值系数的数目最大化,我们要找到一个向量C,这样
如果n-rnk(A)中的最后一个n-rnk(A)系数为零,则这就要求
因此,我们必须清楚地知道(因为我们可以精确地求解)
并计算x':
要将它们组合成一个功能:
是
^{pr2}$但你想
^{3}$输出:
相关问题 更多 >
编程相关推荐