Python Numpy:奇异矩阵

Python Numpy:奇异矩阵,python,numpy,linear-algebra,matrix-inverse,Python,Numpy,Linear Algebra,Matrix Inverse,我试图用NumPy计算X'X形式的矩阵的逆,如下所示 df=pd.read\u csv('https://raw.githubusercontent.com/jianghaochu/data/master/x.csv') X=np.数组(df) X.shape#返回(92,18) np.linalg.det(np.matmul(X.transpose(),X))#返回8.0298638186298 np.linalg.matrix_秩(np.matmul(X.transpose(),X))#返回

我试图用NumPy计算X'X形式的矩阵的逆,如下所示

df=pd.read\u csv('https://raw.githubusercontent.com/jianghaochu/data/master/x.csv')
X=np.数组(df)
X.shape#返回(92,18)
np.linalg.det(np.matmul(X.transpose(),X))#返回8.0298638186298
np.linalg.matrix_秩(np.matmul(X.transpose(),X))#返回17
让我困惑的是,X'X不是满秩的,但行列式是正的,NumPy可以成功地计算X'X的逆。然而,如果我取另一个由X列的子集组成的矩阵Y,则行列式变为零,并且不能计算逆

Y=X[:,[0,12,13,14,15,16,17]]
Y.shape#返回(92,7)
np.linalg.det(np.matmul(Y.transpose(),Y))#返回0.0
np.linalg.matrix_rank(np.matmul(Y.transpose(),Y))#返回16
np.linalg.inv(np.matmul(Y.transpose(),Y))#numpy.linalg.linalgeror:奇异矩阵
numpy.linalg.linalgeror:奇异矩阵

在我看来,Y的列是线性相关的。因此,Y'Y是单数,其行列式为零。向Y(如X)添加更多列不应导致线性独立性。因此,如果Y是单数,我无法理解NumPy如何计算X'X的倒数

我正在使用上述数据计算OLS估计值。当我使用Y中的列(变量)时,我收到一个奇异的错误,我假设这是由于自变量的完全共线。当我在模型中加入更多的自变量并得到一个矩阵X时,我可以使用NumPy成功地得到估计量。这真的让我很困惑,因为它表明增加更多的自变量可以解决完美的共线,这真的让我大吃一惊


整个下午和晚上,我都在苦苦挣扎,但还是找不到线索。我也在R中试过,得到了同样的结果。我希望有人能给我指引一些新的方向。如有任何建议,我们将不胜感激。

请查看此处的讨论:

总结已经说过的话:

  • 之所以会得到这样的结果,是因为numpy使用LU分解来计算逆
  • 这种“逆”不能用于求解线性方程组
  • 这在Numpy 1.12.0中不会发生
  • 矩阵的精度非常高:
    np.linalg.cond(X。T@X) = 
    5.7294895077058016e+17
除此之外,您还可以检查特征值-如果矩阵的一个特征值为零,则其对应的特征向量是线性相关的:

lambdas,V=np.linalg.eig(X。T@X)
lambdas[np.isclose(lambdas,0)]
阵列([1.89103844e-15])