scipy 多元正态概率密度函数

uxh89sit  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(182)

x 中存在缺失值时,Python中是否有高效的实现来计算多元正态分布的PDF?我想,对于要计算概率的特定向量,您可以有效地将维数减少到任意数量的可用数据点。但我不能“我不知道scipy实现是否有办法忽略掩码值。
例如,可以是,

from scipy.stats import multivariate_normal as mvnorm
import numpy as np

means = [0.0,0.0,0.0]
cov = np.array([[1.0,0.2,0.2],[0.2,1.0,0.2],[0.2,0.2,1.0]])
d = mvnorm(means,cov)
x = [0.5,-0.2,np.nan]
d.pdf(x)

产生输出:

nan

(as)
是否有一种方法可以使用此实现仅对存在的值有效地评估PDF(在本例中,将3D案例有效地转换为二元案例?)?

5kgi1eie

5kgi1eie1#

这个问题在数学和代码方面有点棘手。让我来详细说明一下。
首先,代码. scipy.stats没有提供您所希望的非处理功能。快速的代码可能需要手动实现多元正态分布PDF,并将其直接应用于NumPy数组。利用矢量化是为大规模数据集有效提供此功能的唯一方法。另一方面,下面的nan-tolerant函数nanTol_pdf()提供了所需的功能,同时保持了SciPy中实现的多元正态分布。您可能会发现它足以满足您的用例。

def nanTol_pdf(d, x):
    '''
    Function returns function value of multivariate probability density conditioned on 
    non-NAN indices of the input vector x
    '''
    assert isinstance(d, stats._multivariate.multivariate_normal_frozen) and (isinstance(x,list) or isinstance(x,np.ndarray))

    # check presence of nan entries
    if any(np.isnan(x)):
        # indices
        subIndex = np.argwhere(~np.isnan(x)).reshape(-1)

        # lower-dimensional multiv. Gaussian distribution
        lowDim_mean = d.mean[subIndex]
        lowDim_cov  = cov[np.ix_(subIndex, subIndex)]
        lowDim_d    = mvnorm(lowDim_mean, lowDim_cov)

        return (lowDim_d.pdf(x[subIndex]))
    else:
        return d.pdf(x)

无论如何,我们能做到这一点的事实不应该阻止我们思考,如果我们应该。
第二个问题是数学。从数学上讲,我们不清楚要达到什么目的。在示例中,SciPy返回nan,因为您使用了一个定义不明确的输入向量x进行查询。输出未定义,即不返回数字(nan)似乎是最合适的答案。联合截断分布d和输入向量x避开了数值问题,但是产生了统计问题。由于概率密度函数值不能被理解为(条件)概率。此外,如果应用了截断,则输出本身会隐藏。请记住,nanTol_pdf()将很乐意提供非只要向量中至少有一个条目是实数,就将负真实的作为输出。您的用例将决定这是否合理。
最后,我建议在继续前进之前至少考虑丢失的数据imputation techniques。让我知道这是否有帮助。

相关问题