Numpy:奇异矩阵

问题描述 投票:2回答:1

我正在尝试使用NumPy如下计算形式为X'X的矩阵的逆。

df = pd.read_csv('https://raw.githubusercontent.com/jianghaochu/data/master/x.csv')
X = np.array(df)
X.shape  # returns (92, 18)
np.linalg.det(np.matmul(X.transpose(), X))  # returns 8.029863818629298
np.linalg.matrix_rank(np.matmul(X.transpose(), X))  # returns 17

令我困惑的是X'X的等级不高,但行列式为正,NumPy可以成功计算X'X的逆。但是,如果我采用由X列的子集形成的另一个矩阵Y,则行列式变为零,并且无法计算逆。]

Y = X[:, [0, 12, 13, 14, 15, 16, 17]]
Y.shape  # returns (92, 7)
np.linalg.det(np.matmul(Y.transpose(), Y))  # returns 0.0
np.linalg.matrix_rank(np.matmul(Y.transpose(), Y))  # returns 16
np.linalg.inv(np.matmul(Y.transpose(), Y))  # numpy.linalg.LinAlgError: Singular matrix

numpy.linalg.LinAlgError:奇异矩阵

我认为Y的列与线性相关。因此,Y'Y是奇异的,其行列式为零。向Y添加更多列(如在X中)不应导致线性独立。因此,在Y'Y为奇数的情况下,我无法理解NumPy如何计算X'X的逆。

我正在使用以上数据计算OLS估算器。当我在Y中使用列(变量)时,收到一个奇异错误,我认为这是由于自变量的完美共线性所致。当我在模型中添加更多自变量并获得X的矩阵时,我可以使用NumPy成功获得估计量。这确实让我感到困惑,因为它表明添加更多的自变量可以解决完美的共线性,这真让我大吃一惊。

我在整个下午和晚上都在为此苦苦挣扎,但仍然没有头绪。我也在R中尝试过,得到了相同的结果。我希望有人可以指导我一些新的方向。任何建议将不胜感激。

python numpy linear-algebra matrix-inverse
1个回答
0
投票
在此处查看讨论:numpy inverts a singular matrix

总结所讲的内容:

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

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

  • © www.soinside.com 2019 - 2024. All rights reserved.