python - SymPy rref() 返回奇异矩阵的单位矩阵

标签 python numpy matrix sympy

import numpy
import sympy

n = 7
k = 3

X = numpy.random.randn(n,k)
Px = X@numpy.linalg.inv(numpy.transpose(X)@X)@numpy.transpose(X) #X(X'X)^(-1)X'

print(sympy.Matrix(Px).rref())

您可以自己验证,Px 是单数。但是,sympy.rref() 返回:

(Matrix([[1, 0, 0, 0, 0, 0, 0],

[0, 1, 0, 0, 0, 0, 0],

[0, 0, 1, 0, 0, 0, 0],

[0, 0, 0, 1, 0, 0, 0],

[0, 0, 0, 0, 1, 0, 0],

[0, 0, 0, 0, 0, 1, 0],

[0, 0, 0, 0, 0, 0, 1]]), (0, 1, 2, 3, 4, 5, 6))

为什么它不返回真正的 rref?我在某处读到可以传递 simple=True,但是它没有任何区别。

最佳答案

In [49]: Px                                                                     
Out[49]: 
array([[ 0.5418898 ,  0.44245552,  0.04973693, -0.06834885, -0.19086119,
        -0.07003176,  0.06325021],...
       [ 0.06325021, -0.11080081,  0.21656224, -0.07445145, -0.28634725,
         0.06648907,  0.19199866]])
In [50]: np.linalg.det(Px)                                                      
Out[50]: 2.141647537907433e-67
In [51]: np.linalg.inv(Px)                                                      
Out[51]: 
array([[-7.18788695e+15,  4.95655702e+15,  7.52738018e+15,
        -4.40875311e+15, -1.64015565e+16,  2.63785320e+15,
        -3.03465003e+16],
       [ 1.59176426e+16, ....
       [ 3.31636798e+16, -3.39094560e+16, -3.60287970e+16,
        -1.27160460e+16,  2.14338015e+16,  3.32345350e+15,
         3.60287970e+16]])

您的 Px 接近单数,但又不完全如此。对比一下

In [52]: M = np.arange(9).reshape(3,3)                                          
In [53]: np.linalg.det(M)                                                       
Out[53]: 0.0
In [55]: np.linalg.inv(M)                                                       
LinAlgError: Singular matrix

In [56]: sympy.Matrix(M).rref()                                                 
Out[56]: 
(Matrix([
 [1, 0, -1],
 [0, 1,  2],
 [0, 0,  0]]), (0, 1))

从数字上讲,您的 Px 不是单数,只是接近:

In [57]: sympy.Matrix(Px).rref()                                                
Out[57]: 
(Matrix([
 [1, 0, 0, 0, 0, 0, 0],
 [0, 1, 0, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0],
 [0, 0, 0, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 0, 0],
 [0, 0, 0, 0, 0, 1, 0],
 [0, 0, 0, 0, 0, 0, 1]]), (0, 1, 2, 3, 4, 5, 6))

但是使用自定义的 iszerofunc:

In [58]: sympy.Matrix(Px).rref(iszerofunc=lambda x: abs(x)<1e-16)               
Out[58]: 
(Matrix([
 [1, 0, 0,  0.647383887198708, -1.91409951634531, -1.43377991000974,  0.578981680134581],
 [0, 1, 0, -0.839184067893959,  1.88998490600173,  1.43367640627271, -0.611620902311026],
 [0, 0, 1, -0.962221703397948, 0.203783478612254,  1.45929622452135,  0.404548167005728],
 [0, 0, 0,                  0,                 0,                 0,                  0],
 [0, 0, 0,                  0,                 0,                 0,                  0],
 [0, 0, 0,                  0,                 0,                 0,                  0],
 [0, 0, 0,                  0,                 0,                 0,                  0]]),
 (0, 1, 2))

关于python - SymPy rref() 返回奇异矩阵的单位矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54901051/

相关文章:

python - 无法将模块从anaconda环境加载到pycharm中

Ruby Class#new - 为什么 `new` 是私有(private)方法?

algorithm - 具有排序行的矩阵的中值

c - 在C中填充二维数组的算法

python - 使用登录的用户名作为 django 中的字段值

Python "private"类方法和 DRY

python - 使用 easygui 和 pygame 将 .py 制作成独立的可执行文件?

python - 如何使用基于numpy中日期的窗口获取时间序列的回顾移动平均值?

python - 需要了解这个 python 错误

python - 将掩码( bool )数组转换为 x、y 坐标列表