numpy 在Python中提取边缘PDF

bnl4lu3b  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(129)

我有一个简单的问题,我找不到答案。样本是从一个二元正态分布(X,Y)中抽取的,给定参数如下:

import numpy as np
sample = np.random.multivariate_normal([1, 1], [[1, 0.2], [0.2, 0.8]], 10000)

现在我需要从这个联合分布中提取边际分布。我想得到两个数组,fx_x和fy_y,它们包含X和Y的边缘分布。

fx_x = [....]
fy_y = [....]

我该怎么做?谢谢.

c9x0cxw0

c9x0cxw01#

您可以首先使用np.histogram2d计算二维直方图。然后用一些数值方法(如scipy.integrate.simpson)在每个轴上积分,以获得边缘分布。
对于您的特定示例:

import numpy as np
from scipy.integrate import simpson
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

np.random.seed(0)
mean, cov = [1, 5], [[1, .2], [.2, .5]] 
z = np.random.multivariate_normal(mean, cov, 100_000)

fz, ex, ey = np.histogram2d(*z.T, bins=50, density=True)
x = (ex[:-1] + ex[1:]) / 2
y = (ey[:-1] + ey[1:]) / 2

fx = simpson(fz, y, axis=1)
fy = simpson(fz, x, axis=0)

gs = GridSpec(2, 2, width_ratios=[3,1], height_ratios=[1,3])
ax_fz = plt.subplot(gs[1,0])
ax_fx = plt.subplot(gs[0,0], sharex=ax_fz)
ax_fy = plt.subplot(gs[1,1], sharey=ax_fz)

ax_fz.pcolormesh(x, y, fz.T)
ax_fx.bar(x, fx)
ax_fy.barh(y, fy)

plt.show()

相关问题