python - Numpy:奇异矩阵

标签 python numpy linear-algebra matrix-inverse

我正在尝试使用 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: Singular matrix

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

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

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

最佳答案

查看此处的讨论: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])

关于python - Numpy:奇异矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60768479/

相关文章:

python - 如何最适合在网络服务器上运行的API检查其公共(public)可用性/状态

python - Flask + Postgresql 和打开/关闭数据库连接

python - 如何创建具有给定增量的数字范围

python - numpy 数组中的快速替换

python - numpy.tolist() 和 list() 之间精度/显示的差异

python - 如何有效地计算两个字典的内积

python - 使用 OpenCV 对图像进行 mask 和平滑处理

python - 基于多种条件过滤像素

linear-algebra - 单位如何流经矩阵运算?

linear-algebra - 用于进行高斯消去的BLAS/LAPACK例程