如何从矩阵中找到线性独立的行

时间:2015-03-02 18:12:37

标签: python numpy matrix linear-algebra

如何从矩阵中识别线性​​独立的行?例如,

enter image description here

第4行是独立的。

6 个答案:

答案 0 :(得分:21)

首先,您的第3行与1t和第2行呈线性关系。但是,第1列和第4列与线性相关。

您可以使用两种方法:

<强>特征值

如果矩阵的一个特征值为零,则其对应的特征向量与线性相关。文档eig统计特征值不一定是有序的。不知道结果数组中的特征值是刚刚排序还是有一些随机顺序。但是,假设特征值对应于行向量,则方法为:

import numpy as np

matrix = np.array(
    [
        [0, 1 ,0 ,0],
        [0, 0, 1, 0],
        [0, 1, 1, 0],
        [1, 0, 0, 1]
    ])

lambdas, V =  np.linalg.eig(matrix.T)
# The linearly dependent row vectors 
print matrix[lambdas == 0,:]

Cauchy-Schwarz不等式

要测试向量的线性相关性并找出哪些向量,可以使用Cauchy-Schwarz inequality。基本上,如果向量的内积等于向量范数的乘积,则向量是线性相关的。以下是列的示例:

import numpy as np

matrix = np.array(
    [
        [0, 1 ,0 ,0],
        [0, 0, 1, 0],
        [0, 1, 1, 0],
        [1, 0, 0, 1]
    ])

print np.linalg.det(matrix)

for i in range(matrix.shape[0]):
    for j in range(matrix.shape[0]):
        if i != j:
            inner_product = np.inner(
                matrix[:,i],
                matrix[:,j]
            )
            norm_i = np.linalg.norm(matrix[:,i])
            norm_j = np.linalg.norm(matrix[:,j])

            print 'I: ', matrix[:,i]
            print 'J: ', matrix[:,j]
            print 'Prod: ', inner_product
            print 'Norm i: ', norm_i
            print 'Norm j: ', norm_j
            if np.abs(inner_product - norm_j * norm_i) < 1E-5:
                print 'Dependent'
            else:
                print 'Independent'

测试行是一种类似的方法。

然后你可以扩展这个以测试所有向量组合,但我想这个解决方案与大小一样严重。

答案 1 :(得分:16)

使用,您可以使用sympy.Matrix.rref找到线性独立行:

>>> import sympy 
>>> import numpy as np
>>> mat = np.array([[0,1,0,0],[0,0,1,0],[0,1,1,0],[1,0,0,1]])  # your matrix
>>> _, inds = sympy.Matrix(mat).T.rref()   # to check the rows you need to transpose!
>>> inds
[0, 1, 3]

这基本上告诉你行0,1和3是线性独立的,而行2不是(它是行0和1的线性组合)。

然后你可以用切片删除这些行:

>>> mat[inds]
array([[0, 1, 0, 0],
       [0, 0, 1, 0],
       [1, 0, 0, 1]])

这也适用于矩形(不仅适用于二次)矩阵。

答案 2 :(得分:7)

我编辑了Cauchy-Schwartz不等式的代码,该代码随尺寸更好地扩展:输入是矩阵及其维度,而输出是一个新的矩形矩阵,沿着其行包含起始矩阵的线性独立列。这工作假设第一列永远不为null,但可以很容易地推广以便实现这种情况。我观察到的另一件事是1e-5似乎是一个&#34;马虎&#34;阈值,因为在这种情况下发现一些特定的病理载体是线性依赖的:1e-4不会给我相同的问题。我希望这可以提供一些帮助:我很难找到一个真正有效的例程来提取li矢量,所以我愿意与我分享。如果您发现了一些错误,请报告!!

from numpy import dot, zeros
from numpy.linalg import matrix_rank, norm

def find_li_vectors(dim, R):

    r = matrix_rank(R) 
    index = zeros( r ) #this will save the positions of the li columns in the matrix
    counter = 0
    index[0] = 0 #without loss of generality we pick the first column as linearly independent
    j = 0 #therefore the second index is simply 0

    for i in range(R.shape[0]): #loop over the columns
        if i != j: #if the two columns are not the same
            inner_product = dot( R[:,i], R[:,j] ) #compute the scalar product
            norm_i = norm(R[:,i]) #compute norms
            norm_j = norm(R[:,j])

            #inner product and the product of the norms are equal only if the two vectors are parallel
            #therefore we are looking for the ones which exhibit a difference which is bigger than a threshold
            if absolute(inner_product - norm_j * norm_i) > 1e-4:
                counter += 1 #counter is incremented
                index[counter] = i #index is saved
                j = i #j is refreshed
            #do not forget to refresh j: otherwise you would compute only the vectors li with the first column!!

    R_independent = zeros((r, dim))

    i = 0
    #now save everything in a new matrix
    while( i < r ):
        R_independent[i,:] = R[index[i],:] 
        i += 1

    return R_independent

答案 3 :(得分:2)

我知道这是前一段时间被问过的,但这是一个非常简单的解决方案。给定一个数组,下面通过逐步添加向量并测试秩是否增加来找到一组线性独立的向量:

from numpy.linalg import matrix_rank

def LI_vecs(dim,mat):
    LI=[M[0]]
    for i in range(dim):
        tmp=[]
        for r in LI:
            tmp.append(r)
        tmp.append(M[i])                #set tmp=LI+[M[i]]
        if matrix_rank(tmp)>len(LI):    #test if M[i] is linearly independent from all (row) vectors in LI
            LI.append(M[i])             #note that matrix_rank does not need to take in a square matrix
    return LI                           #return set of linearly independent (row) vectors

#Example
mat=[[1,2,3,4],[4,5,6,7],[5,7,9,11],[2,4,6,8]]
LI_vecs(4,mat)

答案 4 :(得分:0)

我将问题解释为找到与其他行线性独立的行。 这等同于找到线性依赖于其他行的行。

高斯消除,将小于阈值的数字视为零即可做到这一点。它比查找矩阵的特征值,用Cauchy-Schwarz不等式测试行的所有组合或奇异值分解要快。

请参阅: https://math.stackexchange.com/questions/1297437/using-gauss-elimination-to-check-for-linear-dependence

浮点数问题:

http://numpy-discussion.10968.n7.nabble.com/Reduced-row-echelon-form-td16486.html

答案 5 :(得分:0)

关于以下讨论:

Find dependent rows/columns of a matrix using Matlab?

from sympy import *
A = Matrix([[1,1,1],[2,2,2],[1,7,5]])
print(A.nullspace())

很明显,第一行和第二行是相乘的。 如果我们执行上面的代码,我们会得到 [-1/3, -2/3, 1]。零空间中零元素的索引显示独立性。但是为什么这里的第三个元素不是零?如果我们将 A 矩阵与零空间相乘,我们会得到一个零列向量。怎么了?

我们正在寻找的答案是 A 转置的零空间。

B = A.T
print(B.nullspace())

现在我们得到了 [-2, 1, 0],这表明第三行是独立的。

这里有两个重要的注意事项:

  1. 考虑我们要检查行依赖关系还是列依赖关系 依赖。

  2. 注意矩阵的零空间不等于零空间 该矩阵的转置空间,除非它是对称的。