如何基于两个PDF计算联合概率并绘制Matplotlib 3D曲面图
解决两个独立PDF的联合概率3D可视化问题
你的核心问题是错误地用PDF值生成了网格X、Y,正确的做法应该用样本点作为二维平面的坐标,再计算对应点的联合概率密度。
关键修正点:
- X、Y应该是二维平面上的坐标网格(对应两个变量的取值),而非PDF的取值
- 若两个变量独立,联合概率密度等于各自PDF的乘积:
P(x,y) = P(x) * P(y)
完整修正代码:
import numpy as np from matplotlib import pyplot as plt from scipy.stats import norm # 生成样本并计算均值、标准差 x1 = norm.rvs(size=1000) x2 = np.array([val if abs(val)<=1 else -val for val in x1]) # 用numpy数组更高效 mean_x1, std_x1 = np.mean(x1), np.std(x1) mean_x2, std_x2 = np.mean(x2), np.std(x2) # 生成二维坐标网格(x轴和y轴的取值范围) samples = np.linspace(-5, 5, 100) X, Y = np.meshgrid(samples, samples) # 计算联合概率密度:独立变量下为两个PDF的乘积 Z = norm.pdf(X, mean_x1, std_x1) * norm.pdf(Y, mean_x2, std_x2) # 3D可视化 fig = plt.figure(figsize=(12, 8)) ax = plt.axes(projection='3d') ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none') # 添加标签提升可读性 ax.set_xlabel('X1 Values') ax.set_ylabel('X2 Values') ax.set_zlabel('Joint Probability Density') ax.set_title('Joint PDF of X1 and X2') plt.show()
代码说明:
- 把
x2的列表推导改为numpy数组,比map更高效且符合数值计算习惯 - 提前计算均值和标准差,避免重复计算
X和Y是样本点的网格,对应二维平面上的每个(x1, x2)坐标Z是每个坐标点的联合概率密度值,通过两个单变量PDF相乘得到- 添加了颜色映射、坐标轴标签和标题,让可视化结果更清晰
内容的提问来源于stack exchange,提问作者DanielG
相关产品推荐
相关产品推荐

