标签:python numpy scipy linear-algebra covariance
在我尝试对方差边界条件的2D数组的方差 – 协方差矩阵执行cholesky分解时,在某些参数组合下,我总是得到LinAlgError:矩阵不是正定的 – 无法计算Cholesky分解.不确定它是否是numpy.linalg或实现问题,因为脚本很简单:
sigma = 3.
U = 4
def FromListToGrid(l_):
i = np.floor(l_/U)
j = l_ - i*U
return np.array((i,j))
Ulist = range(U**2)
Cov = []
for l in Ulist:
di = np.array([np.abs(FromListToGrid(l)[0]-FromListToGrid(i)[0]) for i, x in enumerate(Ulist)])
di = np.minimum(di, U-di)
dj = np.array([np.abs(FromListToGrid(l)[1]-FromListToGrid(i)[1]) for i, x in enumerate(Ulist)])
dj = np.minimum(dj, U-dj)
d = np.sqrt(di**2+dj**2)
Cov.append(np.exp(-d/sigma))
Cov = np.vstack(Cov)
W = np.linalg.cholesky(Cov)
试图消除潜在的奇点也未能解决问题.任何帮助深表感谢.
解决方法:
深入挖掘问题,我尝试打印Cov矩阵的特征值.
print np.linalg.eigvalsh(Cov)
答案结果证明是这样的
[-0.0801339 -0.0801339 0.12653595 0.12653595 0.12653595 0.12653595 0.14847999 0.36269785 0.36269785 0.36269785 0.36269785 1.09439988 1.09439988 1.09439988 1.09439988 9.6772531 ]
啊哈!注意前两个负特征值?现在,当且仅当所有特征值都为正时,矩阵才是正定的.因此,矩阵的问题并不是它接近于“零”,而是“负面”.为了扩展@duffymo类比,这是线性代数相当于试图取负数的平方根.
现在,让我们尝试执行相同的操作,但这次是scipy.
scipy.linalg.cholesky(Cov, lower=True)
这不能说更多的东西
numpy.linalg.linalg.LinAlgError: 12-th leading minor not positive definite
这更能讲述一些事情(虽然我无法理解为什么它抱怨第12个未成年人).
底线,矩阵不是很接近’零’但更像是’负’
标签:python,numpy,scipy,linear-algebra,covariance 来源: https://codeday.me/bug/20191007/1869656.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。