Python numpy矩阵秩不正确的结果

Python numpy矩阵秩不正确的结果,python,numpy,matrix,rank,Python,Numpy,Matrix,Rank,我在使用numpy.linalg.matrix\u rank()时遇到了一个奇怪的问题 我有一个矩阵a,它有三列>100行。A由0和1组成。当我使用numpy.linalg.matrix\u秩(A)时,我得到了answer=3,这是正确的。 但是,当我向a添加一个长度相同的新列(a现在有四个列)并使用numpy.linalg.matrix\u秩(a)时,我得到了answer=1,这没有任何意义。新栏中的数字以千为单位。所有数据类型都是float32 有人知道问题出在哪里吗?谢谢 下面是一个随机生

我在使用
numpy.linalg.matrix\u rank()
时遇到了一个奇怪的问题
我有一个矩阵a,它有三列>100行。A由0和1组成。当我使用
numpy.linalg.matrix\u秩(A)
时,我得到了
answer=3
,这是正确的。
但是,当我向a添加一个长度相同的新列(a现在有四个列)并使用
numpy.linalg.matrix\u秩(a)
时,我得到了
answer=1
,这没有任何意义。新栏中的数字以千为单位。所有数据类型都是float32

有人知道问题出在哪里吗?谢谢

下面是一个随机生成的示例。这是一个40*3的阵列a

数组([[0,0,1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 0.,  0.,  1.],
[ 1.,  0.,  1.],
[1,1,1.],dtype=float32)

矩阵的秩(A)是3

现在,我添加了第四列,A现在是:

array([[  6.42096562e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  2.15370996e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  1.28050068e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  3.20350176e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  4.26681055e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  1.55057520e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  6.82897266e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  5.29479727e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  2.54858457e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.82017109e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  4.03392627e+03,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  2.24184062e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  6.90389688e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  2.75718145e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  6.67467109e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  4.78061758e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  1.52730410e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.13073359e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  1.51932471e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.27319297e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  7.41743359e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  7.98595469e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  3.40574414e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  3.12823730e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  5.66580273e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  4.53152070e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.84440938e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  7.13604375e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  3.59290312e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  8.91415820e+03,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  5.73751992e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  3.96208867e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  2.06492324e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  1.50155918e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  6.47758789e+02,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.27601094e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  9.77911621e+03,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  5.01128320e+04,   0.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  7.21259922e+04,   1.00000000e+00,   0.00000000e+00,
      1.00000000e+00],
   [  6.10147461e+03,   1.00000000e+00,   1.00000000e+00,
      1.00000000e+00]], dtype=float32)
矩阵的秩(A)是2。这可能吗?

“…这没有意义。”事实上,如果你知道
矩阵秩
如何估计秩,它确实有意义
矩阵_秩
仅计算不近似为0的矩阵数。如果奇异值相对于最大奇异值很小,则视为0。当您添加包含“以千为单位”的数字的第四列时,将添加一个较大的单数值。与新的大奇异值相比,三个原始奇异值较小,因此它们被视为0,不计入秩

这里有一个例子
A
是0和1的数组<代码>B是通过在
a
中添加一个包含100000的列来创建的:

In [217]: np.random.seed(123)

In [218]: A = np.random.randint(0, 2, size=(100, 3)).astype(np.float32)

In [219]: B = np.hstack((A, 100000*np.ones((A.shape[0], 1)))).astype(np.float32)
In [221]: np.linalg.svd(A)[1]
Out[221]: array([ 9.98757744,  5.41796255,  4.88814735], dtype=float32)
正如所料,
A
的排名为3:

In [220]: np.linalg.matrix_rank(A)
Out[220]: 3
以下是
A
的奇异值:

In [217]: np.random.seed(123)

In [218]: A = np.random.randint(0, 2, size=(100, 3)).astype(np.float32)

In [219]: B = np.hstack((A, 100000*np.ones((A.shape[0], 1)))).astype(np.float32)
In [221]: np.linalg.svd(A)[1]
Out[221]: array([ 9.98757744,  5.41796255,  4.88814735], dtype=float32)
与您的示例一样,
B
的排名为1:

In [222]: np.linalg.matrix_rank(B)
Out[222]: 1
我们可以看到,
B
有一个奇异值比其他三个大得多。大小的差异足以使
矩阵_秩
认为较小的奇异值约为0:

In [223]: np.linalg.svd(B)[1]
Out[223]: 
array([  1.00000000e+06,   5.45980692e+00,   4.90207911e+00,
         4.59457588e+00], dtype=float32)
请注意,
matrix\u rank
将数据类型考虑在内。如果将
B
转换为64位浮点,则由
matrix_rank
计算的秩为4:

In [226]: np.linalg.matrix_rank(B.astype(np.float64))
Out[226]: 4

你能提供一个可复制的例子吗?嗨。。。欢迎来到StackOverflow。提出问题时,应确保问题可以重现。您应该在问题中包括目标、当前结果、错误以及您迄今为止所做的尝试。请分享代码,如果可能的话,分享数据或要复制的东西,以及你得到的确切错误。谢谢。你能用3列和你想添加的列(至少前10个值)向我们展示你的输入吗?以及第四栏的最大值?谢谢!这是有道理的。我已经把这个例子移到了这个问题上。这是一个数字问题。如果SVD不能很好地估计等级,那么SVD不是正确的方法。其他方法,如高斯消去法,应检查出来。