gpt4 book ai didi

python - numpy 矩阵排名不正确的结果

转载 作者:行者123 更新时间:2023-11-28 21:47:13 25 4
gpt4 key购买 nike

我在使用 numpy.linalg.matrix_rank() 时遇到了一个奇怪的问题。
我有一个矩阵 A,它具有三列和 >100 行。 A由0和1组成。当我使用 numpy.linalg.matrix_rank(A) 时,我得到了 answer=3,这是正确的。
但是,当我向 A 添加一个长度相同的新列(A 现在有四个列)并使用 numpy.linalg.matrix_rank(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)

numpy.linalg.matrix_rank(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)

numpy.linalg.matrix_rank(A) 是 2。这可能吗?

最佳答案

“...这毫无意义。”实际上,如果您知道matrix_rank 估计 排名,它确实有意义。 matrix_rank 只是计算 singular values 的数量矩阵的不近似为 0。如果奇异值相对于最大奇异值较小,则将其视为 0。当您添加包含“以千计”的数字的第四列时,您添加了一个大的奇异值。三个原始奇异值与新的大奇异值相比较小,因此它们被视为 0,不计入排名。

这是一个例子。 A 是 0 和 1 的数组。 B 是通过将包含 100000 的列附加到 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)

正如预期的那样,A 的等级为 3:

In [220]: np.linalg.matrix_rank(A)
Out[220]: 3

下面是 A 的奇异值:

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 有一个奇异值比其他三个奇异值大得多。幅度上的差异足以使 matrix_rank 认为较小的奇异值近似为 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_rank 考虑了数据类型。如果将B转换为64位 float ,则matrix_rank计算出的秩为4:

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

关于python - numpy 矩阵排名不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com