Python中的多元正规CDF

Python中的多元正规CDF,python,numpy,scipy,gaussian,normal-distribution,Python,Numpy,Scipy,Gaussian,Normal Distribution,我正在寻找一个函数来计算多元正态分布的CDF。我发现scipy.stats.multivariable\u normal只有一种计算PDF的方法(对于样本x),而没有CDFmultivariable\u normal.PDF(x,mean=mean,cov=cov) 我在寻找同样的东西,但要计算cdf,比如:multivariable\u normal.cdf(x,mean=mean,cov=cov),但不幸的是multivariable\u normal没有cdf方法 我唯一发现的是: 但是,

我正在寻找一个函数来计算多元正态分布的CDF。我发现
scipy.stats.multivariable\u normal
只有一种计算PDF的方法(对于样本
x
),而没有CDF
multivariable\u normal.PDF(x,mean=mean,cov=cov)

我在寻找同样的东西,但要计算cdf,比如:
multivariable\u normal.cdf(x,mean=mean,cov=cov)
,但不幸的是
multivariable\u normal
没有cdf方法

我唯一发现的是:
但是,所提出的方法
scipy.stats.mvn.mvnun(lower,upper,means,covar)
没有将样本
x
作为参数,因此我真的不知道如何使用它来获得类似于我上面所说的内容。

某些分布的CDF实际上是该分布PDF的整数。既然如此,您需要为函数提供积分的边界

当大多数人要求p_值与某个分布相关时,他们的意思是:

考虑到这种分布,获得这些值或更高值的机会有多大

注意红色标记的区域-它不是一个点,而是从某个点开始的积分:

因此,需要将点设置为下边界,+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
来自sys import maxsize的

def mvn_p_值(x、mu、cov_矩阵):
upper_bounds=np.array([maxsize]*x.size)#为向量的大小设置一个上限
p_值=scipy.stats.mvn.mvnun(x,上界,mu,cov_矩阵)[1]
如果0.5
这只是对@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



开始检查。这是一个高质量的库(如果你不熟悉的话)@sascha我问的问题与scipy.stats.mvn.mvnun同样适用于你在这个链接中提供的库。那么你到底想要什么呢?你想拟合点的分布吗?@sascha No。我已经解释过了:我有一个均值(向量)和协方差矩阵,它定义了多元正态分布。给定一个新的数据点x(向量),我想计算它的累积概率(CDF),而不是概率密度(PDF)。不知道这个问题吗?