我假设您知道一般的直方图是什么。 N维特征空间中数据的联合直方图是N维的。您只需将数据点放入 N 维箱(通常是 N 维网格的笛卡尔积)。边际直方图小于 N 维直方图,其中一个或多个维度已被忽略。联合直方图和边缘直方图与joint/marginal distributions 非常相似。
如何计算它们取决于您的具体情况。您可以通过在某些维度上积分来从联合直方图计算边际直方图,或者您可以以与联合直方图相同的方式构建它们,但维度更少。例如,在 Matlab 中,histcounts2 计算二维数据的联合直方图。对于更高维度的数据,accumarray 可能会有所帮助。在带有 NumPy 的 Python 中,histogramdd 生成多维直方图。通常,N 维 bin 是每个维度中 bin 的笛卡尔积,生成的直方图是简单的 Numpy 数组(在 Python 中)或矩阵(在 Matlab 中)。
N=2D 中的简单示例(在 Matlab 中)
让我们先创建一些数据
x = 3*randn(1e4, 1);
y = randn(1e4, 1);
scatter(x, y, '.');
xlim([-10,10]);
ylim([-10,10]);
pbaspect([1,1,1]);
让我们计算联合直方图
h = histcounts2(x, y, -10:10, -10:10);
让我们显示联合直方图并在每一侧显示边缘直方图,这可以通过在一维上整合联合直方图或通过分别为数据轴创建一维直方图来获得。这里边际直方图是通过计算一维直方图(忽略其他数据维度)创建的。
fig = figure;
subplot('Position', [0.35, 0.35, 0.6, 0.6]);
im = imagesc(-10:10, -10:10, h.');
im.Parent.YDir = 'normal';
axis image;
title('joint histogram (x,y)');
subplot('Position', [0.43, 0.1, 0.45, 0.15]);
histogram(x, -10:10);
camroll(180);
title('marginal histogram x');
subplot('Position', [0.2, 0.4, 0.15, 0.55]);
histogram(y, -10:10);
camroll(90);
title('marginal histogram y');
可以清楚地看到,边缘直方图只是对应于沿一个方向的联合直方图的加法。