numpy 求高条件数矩阵的逆

ttcibm8c  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(96)

我试图找到this 9x9 covariance matrix的逆,这样我就可以用它和mahalanobis distance一起使用。然而,我从matrix inverse得到的结果是一个充满1.02939420e+16的矩阵。我一直在试图找到原因,考虑到Wolfram会给我给予正确的答案,这似乎与矩阵的条件数有关,在这种情况下是3.98290435292e+16
虽然我想了解这背后的数学原理,但我现在真正需要的只是这个问题的解决方案,这样我就可以继续实现。有没有一种方法可以找到这样的矩阵的逆矩阵?或者有没有可能直接从数据中找到逆协方差矩阵?

**编辑:**矩阵数据(与pastebin链接相同)

[[ 0.46811097  0.15024959  0.01806486 -0.03029948 -0.12472314 -0.11952018 -0.14738093 -0.14655549 -0.06794621]
 [ 0.15024959  0.19338707  0.09046136  0.01293189 -0.05290348 -0.07200769 -0.09317139 -0.10125269 -0.12769464]
 [ 0.01806486  0.09046136  0.12575072  0.06507481 -0.00951239 -0.02944675 -0.05349869 -0.07496244 -0.13193147]
 [-0.03029948  0.01293189  0.06507481  0.12214787  0.04527352 -0.01478612 -0.02879678 -0.06006481 -0.1114809 ]
 [-0.12472314 -0.05290348 -0.00951239  0.04527352  0.164018    0.05474073 -0.01028871 -0.02695087 -0.03965366]
 [-0.11952018 -0.07200769 -0.02944675 -0.01478612  0.05474073  0.13397166  0.06839442  0.00403321 -0.02537928]
 [-0.14738093 -0.09317139 -0.05349869 -0.02879678 -0.01028871  0.06839442  0.14424203  0.0906558   0.02984426]
 [-0.14655549 -0.10125269 -0.07496244 -0.06006481 -0.02695087  0.00403321  0.0906558   0.17054466  0.14455264]
 [-0.06794621 -0.12769464 -0.13193147 -0.1114809  -0.03965366 -0.02537928  0.02984426  0.14455264  0.32968928]]

字符串

eh57zj3b

eh57zj3b1#

您提供的矩阵m具有0的行列式,因此从数值的Angular 来看是不可逆的(这解释了您具有的大值往往会碰撞到Inf):

In [218]: np.linalg.det(m)
Out[218]: 2.8479946613617788e-16

字符串
如果你开始做线性代数运算/解决问题,我强烈建议检查一些基本概念,这将避免数字错误/错误:https://en.wikipedia.org/wiki/Invertible_matrix

kqlmhetl

kqlmhetl2#

你面临着一个非常重要和基本的数学问题。如果你的方法给出了不可逆矩阵,那么这个方法就有麻烦了。这个方法试图解决一个ill-posed problem。可能所有的适定性问题在十九世纪都已经解决了。解决不适定问题的最常见方法是:提出的问题是regularization。有时Moore-Penrose pseudoinverse可能是方便的。Scipy.linalg有伪逆。但伪逆不是一个捷径。使用伪逆你取代非-可解问题A被可解问题B所替代。有时候,问题B的解可以成功地代替问题A的不存在的解,但这是一个数学研究的问题。

o2rvlv0m

o2rvlv0m3#

零行列式意味着您的矩阵具有线性相关的行(或列)。换句话说,模型中的某些信息是冗余的(它包含过多或重复的信息)。重新开发模型以排除冗余。

vfhzx4xs

vfhzx4xs4#

计算协方差并求逆like here

import numpy as np
from scipy.spatial.distance import mahalanobis,euclidean
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

X = np.array([[ 0.46811097,  0.15024959,  0.01806486, -0.03029948, -0.12472314, -0.11952018, -0.14738093, -0.14655549, -0.06794621],
 [ 0.15024959 , 0.19338707, 0.09046136, 0.01293189, -0.05290348, -0.07200769, -0.09317139, -0.10125269, -0.12769464],
 [0.01806486, 0.09046136, 0.12575072, 0.06507481, -0.00951239, -0.02944675, -0.05349869, -0.07496244, -0.13193147],
 [-0.03029948, 0.01293189, 0.06507481, 0.12214787, 0.04527352, -0.01478612, -0.02879678, -0.06006481, -0.1114809 ],
 [-0.12472314, -0.05290348, -0.00951239, 0.04527352, 0.164018, 0.05474073, -0.01028871, -0.02695087, -0.03965366],
 [-0.11952018, -0.07200769, -0.02944675, -0.01478612, 0.05474073, 0.13397166, 0.06839442, 0.00403321, -0.02537928],
 [-0.14738093, -0.09317139, -0.05349869, -0.02879678, -0.01028871, 0.06839442, 0.14424203, 0.0906558, 0.02984426],
 [-0.14655549, -0.10125269, -0.07496244, -0.06006481, -0.02695087, 0.00403321, 0.0906558, 0.17054466, 0.14455264],
 [-0.06794621, -0.12769464, -0.13193147, -0.1114809, -0.03965366, -0.02537928, 0.02984426, 0.14455264, 0.32968928]])

cov = np.cov(X, rowvar=False)
covI = np.linalg.inv(cov)
# mean=np.mean(X)
md = mahalanobis(X[0], X[1], covI)

# compare with PCA
pca = PCA(whiten=True)      # !! When True (False by default) the components_ vectors are multiplied by the square root of n_samples and then divided by the singular values to ensure uncorrelated outputs with unit component-wise variances.
X_transformed= pca.fit_transform(X)

print('Mahalanobis distance: '+str(md))
print('Euclidean distance: '+str(euclidean(X_transformed[0],X_transformed[1])))

## Mahalanobis distance: 4.094095146671607
## Euclidean distance: 3.999999999999999

字符串
或者可以将它与 * Cholesky分解 * 算法here和数学OR一起使用,另一种方法是使用cho_factorcho_solve函数,这比计算显式逆矩阵更有效。但是Cholesky分解只能应用于其quadratic form中的平方正定矩阵-ensure this
p.s. mahalanobis distance vs. euclidean,或在此:
数据点之间的平方Mahalanobis距离与对数据的主成分计算的加权平方Euclidean距离成正比。权重为1/成分的特征值
我想可能会有一些不匹配,由于不稳定的手动逆矩阵。
p.p.s. PCA for image analysis. N.B.使用SVD分解,您可以始终检查 * 冗余参数 *(或LinRegr中的相互依赖特征)的存在-请参阅S的zero eigenvalues,以消除它们(以及与它们相关的特征向量)用于MLR,或者可能以某种方式将它们用于图像分析。

相关问题