You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.multivariate_normal采样及计算样本概率的疑问

多元正态分布采样与概率计算问题解答

任务背景

从多元正态分布中抽取N个样本,并计算每个样本的近似概率,使用scipy.stats.multivariate_normal或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)

# 定义多元正态分布
mvn = multivariate_normal(mean=np.zeros(num_features), cov=np.diag(std), allow_singular=False, seed=42)

# 抽取样本
sample = mvn.rvs(size=num_samples)

# 计算样本的概率密度
prob = mvn.pdf(x=sample)

# 输出样本(示例)
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(prob)
"""
[26861.56848337 17002.29353025  2182.26793265  3749.65049331
 42004.63147989  3700.70037411  5569.30332186 16103.44975393
 14760.64667235 19148.40325233]
"""

问题解答

1. 关于rvs()函数的参数使用

你完全没遗漏,这么做是对的。当你通过multivariate_normal()创建分布实例mvn时,已经把mean、cov这些核心参数绑定到了实例上,调用rvs()时默认会使用这些预定义的参数。只有当你需要临时用不同的均值/协方差生成样本时,才需要额外传入mean和cov参数覆盖原有设置。

2. 将概率密度转换为近似概率

首先明确:连续型分布的单点概率严格为0,你拿到的pdf()结果是概率密度值,它可以大于1,这完全正常(比如一维正态分布如果方差很小,峰值会远高于1)。如果要得到某点附近的近似概率,需要计算该点周围一个极小超立方体的体积,再乘以概率密度值。

具体操作步骤:

  • 设定每个特征维度上的极小区间长度delta(比如delta=1e-3)
  • 计算d维空间中超立方体的体积:volume = delta ** num_features
  • 近似概率 = 概率密度值 × 体积

对应代码示例:

delta = 1e-3  # 可根据需求调整区间大小
volume = delta ** num_features
approx_prob = prob * volume
print(approx_prob)

注意:delta越小,近似结果越接近真实的“局部概率”,但结果会非常小,毕竟连续分布单点的真实概率为0。

内容的提问来源于stack exchange,提问作者BeginnersMindTruly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:25:21