我在用scipy计算多元正态分布的累积分布函数。
我遇到了**“输入矩阵必须是对称正定的”**错误。
据我所知,对角元素为正的对角矩阵是正定的(see page 1 problem 2)
然而,对于这些对角线值的不同(相对)小的值,对于较小的值显示出误差。
例如,以下代码:
import numpy as np
from scipy.stats import multivariate_normal
std = np.array([0.001, 2])
mean = np.array([1.23, 3])
multivariate_normal(mean=mean, cov=np.diag(std**2)).cdf([2,1])
返回0.15865525393145702,同时将第三行更改为:
std = np.array([0.00001, 2])
导致显示错误。
我猜这和浮点数的计算误差有关,问题是cover矩阵的维数越大,对角线上可接受的正值就越大。
我尝试了维度为9x9的协方差矩阵对角线上的多个值。似乎当其他对角线值非常大时,小值会导致错误。
1条答案
按热度按时间dfty9e191#
检查堆栈跟踪,您将看到它假定条件号为
1e6*np.finfo('d').eps ~ 2.2e-10
输入到eps的有效值在你的例子中,较小的特征值比最大的特征值小
5e-6**2
倍,所以它将被视为零。您可以传递allow_singular=True以使其工作