我想做一些可能非常简单,但给我带来困难的事情。尝试从多元正态分布中抽取N
样本,并计算每个随机抽取样本的概率。在这里,我尝试使用scipy
,但我也愿意使用np.random.multivariate_normal
。这是最简单的。
>>> import numpy as np
>>> from scipy.stats import multivariate_normal
>>> num_samples = 10
>>> num_features = 6
>>> std = np.random.rand(num_features)
# define distribution
>>> mvn = multivariate_normal(mean = np.zeros(num_features), cov = np.diag(std), allow_singular = False, seed = 42)
# draw samples
>>> sample = mvn.rvs(size = num_samples); sample
# determine probability of each drawn sample
>>> prob = mvn.pdf(x = sample)
# print samples
>>> print(sample)
[[ 0.04816243 -0.00740458 -0.00740406 0.04967142 -0.01382643 0.06476885]
...
[-0.00977815 0.01047547 0.03084945 0.10309995 0.09312801 -0.08392175]]
# print probability all samples
[26861.56848337 17002.29353025 2182.26793265 3749.65049331
42004.63147989 3700.70037411 5569.30332186 16103.44975393
14760.64667235 19148.40325233]
字符串
这让我感到困惑,原因有几个:
- 对于
rvs
采样函数:我没有在docs中使用关键字参数mean
和cov
,因为在mvn = multivariate_normal(mean = np.zeros(num_features), cov = np.diag(std), allow_singular = False, seed = 42)
中定义一个mean
和cov
的分布,然后在rvs
调用中重复该定义似乎很奇怪。 - 对于
mvn.pdf
调用,概率密度显然是>1,这对于连续多元正态分布来说并非不可能,但我想将这些数字转换为特定点的近似概率。
谢谢你,谢谢
1条答案
按热度按时间agxfikkp1#
我没有在文档中使用关键字arguments mean和cov.我错过了什么吗?
不,你所做的是允许的。发行版的设计允许调用带参数的方法(正如你在文档中所读到的那样),也允许“冻结”带参数的发行版和调用不带参数的方法。这些是等价的:
字符串
我想把这些数字转换成那个特定点的近似概率。我怎么做呢?.我想计算样本值的特定范围内的概率。
您可以定义一个边长为
eps
的超立方体,并计算该超立方体内的累积密度(使用SciPy 1.10.0+)。型
你可以通过将概率密度乘以超立方体的体积得到近似相同的结果:
型
如果你喜欢超球面区域,你可以乘以超球面的体积,而不是超立方体的体积。对于一个6维空间,超球面的直径为
eps
,vol = np.pi**3/6 * (eps/2)**6
。