Python 函数scipy.linalg.lu中的上三角矩阵是否始终为行列形式?
我有一个m x n矩阵a,n>m,我试图通过它的行梯队形式来识别独立的行。函数scipy.linalg.lu返回矩阵的PLU分解,但U因子似乎不是梯队形式,即枢轴不是阶梯模式。据我所知,U因子应该总是在一个阶梯模式中 考虑以下示例:Python 函数scipy.linalg.lu中的上三角矩阵是否始终为行列形式?,python,numpy,matrix,scipy,linear-algebra,Python,Numpy,Matrix,Scipy,Linear Algebra,我有一个m x n矩阵a,n>m,我试图通过它的行梯队形式来识别独立的行。函数scipy.linalg.lu返回矩阵的PLU分解,但U因子似乎不是梯队形式,即枢轴不是阶梯模式。据我所知,U因子应该总是在一个阶梯模式中 考虑以下示例: from numpy import array from scipy.linalg import lu A = array([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0], [1, 1, 0, 0, 1, 0, 1, 0, 1
from numpy import array
from scipy.linalg import lu
A = array([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 1, 0, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 1, 1, 0, 1, 0, 0, 1],
[1, 1, 0, 0, 1, 1, 1, 1, 1, 1]])
P, L, U = lu(A)
U系数不是成排梯队形式。对于每一行k,枢轴应始终位于行k-1中枢轴的右侧。请参见第五行的轴不在第四行的轴的右侧:
array([[ 1., 1., 1., 1., 0., 1., 1., 1., 1., 0.],
[ 0., 1., 0., 1., 1., 0., 1., 0., 0., 1.],
[ 0., 0., -1., -1., 0., 0., 0., -1., -1., 0.],
[ 0., 0., 0., 0., 1., -1., 0., 0., 1., 1.],
[ 0., 0., 0., 0., 1., 0., 0., 1., 1., 1.]])
我以前从未见过LUP分解,但我怀疑它并不像你想象的那样。我在Matlab中进行了与上面在Python中相同的分解,得到了与您完全相同的结果。所以我不认为这是Python LU函数的问题 更新: 我也在R中实现了这一点(下面的代码),U矩阵再次给出了与Matlab和Python相同的结果。与其他警告不同,它给出了以下警告:
Warning message:
In .local(x, ...) :
Exact singularity detected during LU decomposition: U[i,i]=0, i=4.
Matlab:
代码:
Matlab结果:U= Python结果(来自您的代码): R: 代码:
不能保证LU分解将产生行梯队形式的U矩阵。在这种情况下,它失败的原因可能是因为矩阵是奇异的;我强烈怀疑这就是原因,因为奇异矩阵的一个特征是缺少一组完整的枢轴
有关详细信息,请参见中的一般矩阵部分和其中提供的参考。请提供示例代码。顺便说一下,我已经解决了通过QR分解识别独立行的问题,虽然我的第一次尝试是按照线性代数教科书,通过高斯消去法来识别它们。
scipy.linalg.lu
()并没有说U
将以行列形式()。上面说是上三角形(),这很奇怪。根据U系数的以下属性(STRANG,1988,第72页),第五列中枢轴下方的元素应为零,而不是1:“(i)非零行排在第一位,否则会有行交换,枢轴是这些行中的第一个非零条目。(ii)每个支点下面是一列零,通过消去法获得。(iii)每个支点位于上一行支点的右侧。这产生了阶梯模式。”STRANG,G.线性代数及其应用。第三版,汤姆森,1988年。事实上,我应用LU分解的矩阵比上面例子中给出的矩阵大得多,而U因子在阶梯模式中比上面给出的要小得多。我目前的假设是Python和Matlab中LU函数计算的U因子中的行没有正确排序。我也在R中进行了因子分解(见更新的答案),它也给出了相同的结果。R给出的奇点警告仅对平方矩阵有意义。消除后,矩形矩阵的对角位置很可能有零。与平方矩阵不同,对角线中的零并不意味着矩阵是秩亏矩阵或没有逆矩阵。事实上,示例中的矩阵A是满秩的。有趣的是,如果我取消术语U[5,5],通过减去第4行和第5行,我得到了预期的行梯队形式,但乘以因子PLU并不能恢复A。这似乎违反了Strang(1998,第72页)中的(iii)。我认为这更像是一个线性代数问题,而不是一个计算问题。我将在数学交流上发表这个问题。
A = ([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 1, 0, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 1, 1, 0, 1, 0, 0, 1],
[1, 1, 0, 0, 1, 1, 1, 1, 1, 1]]);
[L,U,P] = lu(A);
U
1 1 1 1 0 1 1 1 1 0
0 1 0 1 1 0 1 0 0 1
0 0 -1 -1 0 0 0 -1 -1 0
0 0 0 0 1 -1 0 0 1 1
0 0 0 0 1 0 0 1 1 1
U =
array([[ 1., 1., 1., 1., 0., 1., 1., 1., 1., 0.],
[ 0., 1., 0., 1., 1., 0., 1., 0., 0., 1.],
[ 0., 0., -1., -1., 0., 0., 0., -1., -1., 0.],
[ 0., 0., 0., 0., 1., -1., 0., 0., 1., 1.],
[ 0., 0., 0., 0., 1., 0., 0., 1., 1., 1.]])
library(Matrix)
A <- Matrix( c( 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 1, 0, 1, 0, 1, 1 , 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 , 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 , 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 ),nrow=5,ncol=10,byrow=TRUE )
expand(mylu <-lu(A))
class "dtrMatrix" (unitriangular)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 . . . .
[2,] 0 1 . . .
[3,] 1 0 1 . .
[4,] 1 0 1 1 .
[5,] 1 0 1 0 1
$U
5 x 10 Matrix of class "dgeMatrix"
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 0 1 1 1 1 0
[2,] 0 1 0 1 1 0 1 0 0 1
[3,] 0 0 -1 -1 0 0 0 -1 -1 0
[4,] 0 0 0 0 1 -1 0 0 1 1
[5,] 0 0 0 0 1 0 0 1 1 1
$P
5 x 5 sparse Matrix of class "pMatrix"
[1,] | . . . .
[2,] . . . | .
[3,] . . | . .
[4,] . | . . .
[5,] . . . . |