scipy 多变量正态错误:输入矩阵必须为对称正定矩阵

noj0wjuj  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(246)

我在用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的协方差矩阵对角线上的多个值。似乎当其他对角线值非常大时,小值会导致错误。

dfty9e19

dfty9e191#

检查堆栈跟踪,您将看到它假定条件号为
1e6*np.finfo('d').eps ~ 2.2e-10输入到eps的有效值
在你的例子中,较小的特征值比最大的特征值小5e-6**2倍,所以它将被视为零。
您可以传递allow_singular=True以使其工作

import numpy as np
from scipy.stats import multivariate_normal
std = np.array([0.000001, 2])
mean = np.array([1.23, 3])
multivariate_normal(mean=mean, cov=np.diag(std**2), allow_singular=True).cdf([2,1])

相关问题