Python中的多元正态分布累积分布函数

3
我正在寻找一种计算多元正态分布的累积分布函数(CDF)的函数。我发现scipy.stats.multivariate_normal只有一种方法来计算概率密度函数(PDF)(对于样本x),但没有CDF multivariate_normal.pdf(x, mean=mean, cov=cov)
我正在寻找相同的东西,但是要计算cdf,就像这样:multivariate_normal.cdf(x, mean=mean, cov=cov),但不幸的是multivariate_normal没有cdf方法。
我唯一发现的东西是这个:Multivariate Normal CDF in Python using scipy,但是提供的方法scipy.stats.mvn.mvnun(lower, upper, means, covar)不接受样本x作为参数,所以我真的不知道如何使用它来得到类似我上面说的东西。

1
开始检查 这个链接。如果您不熟悉它,这是一个高质量的库。 - sascha
那么你究竟想要什么?你想对这些点进行分布拟合吗? - sascha
@sascha 不是的。我已经解释过了:我有一个均值(向量)和协方差矩阵,它们定义了一个多元正态分布。给定一个新的数据点x(向量),我想计算它的累积概率(CDF),而不是概率密度(PDF)。 - eLearner
好的。检查一下实现这个功能的Matlab函数。有一篇参考文献。看起来你需要自己实现它。 - sascha
实际上,我所提到的scipy.stats.mvn.mvnun(...)方法假定多元正态分布以原点为中心,并且您已经归一化了所有方差,这就是为什么它不以数据点x作为参数(我在这里读到的:http://www.nhsilbert.net/source/2014/04/multivariate-normal-cdf-values-in-python/)。因此,我确信有一种方法可以使用此方法和新数据点`x`,以获得我们想要的概率。我只是不知道如何。 - eLearner
显示剩余2条评论
2个回答

2
这仅是对@sascha在评论中提到的答案要点的澄清。相关函数可以在这里找到:
例如,在具有对角协方差的多元正态分布中,cfd应该给出(1/4) *总面积=0.25(如果您不明白原因,请查看下面的散点图)。以下示例将使您玩转它:
from statsmodels.sandbox.distributions.extras import mvnormcdf
from scipy.stats import mvn

for i in range(1, 20, 2):
    cov_example = np.array(((i, 0), (0, i)))
    mean_example = np.array((0, 0))
    print(mvnormcdf(upper=upper, mu=mean_example, cov=cov_example))

这个的输出是0.25,0.25,0.25,0.25...

enter image description here


1
某些分布的累积分布函数实际上是该分布概率密度函数的积分。因此,您需要为函数提供积分的边界。
当大多数人询问与某个分布相关的某个点的p值时,他们实际上是指:
“在给定这个分布的情况下,得到这些值或更高值的机会有多大?”
请注意红色标记的区域-它不是一个点,而是从某个点开始的积分:

enter image description here

相应地,您需要将您的点设置为下限,+inf(或某个任意高的值)作为上限,并提供您已经拥有的均值和协方差矩阵:
from sys import maxsize

def mvn_p_value(x, mu, cov_matrix):
    upper_bounds = np.array([maxsize] * x.size)  # make an upper bound the size of your vector
    p_value = scipy.stats.mvn.mvnun(x, upper_bounds, mu, cov_matrix)[1]
    if 0.5 < p_value:  # this inversion is used for two-sided statistical testing
        p_value = 1 - p_value
    return p_value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接