我有一个简单的问题,我找不到答案。样本是从一个二元正态分布(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 = [....]
我该怎么做?谢谢.
c9x0cxw01#
您可以首先使用np.histogram2d计算二维直方图。然后用一些数值方法(如scipy.integrate.simpson)在每个轴上积分,以获得边缘分布。对于您的特定示例:
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()
1条答案
按热度按时间c9x0cxw01#
您可以首先使用
np.histogram2d
计算二维直方图。然后用一些数值方法(如scipy.integrate.simpson
)在每个轴上积分,以获得边缘分布。对于您的特定示例: