如何通过histogram2d计算二维经验CDF的矩阵表示
二维经验PDF转CDF的方案分析与正确实现
方案正确性判断
- 方案1(分轴逐次
np.cumsum):方向正确,但需注意归一化与操作细节 - 方案2(展平后
cumsum再重塑):完全错误
详细解释
二维经验CDF的核心定义是:对于任意点$(x,y)$,$\text{CDF}(x,y)$表示样本中满足$X \leq x$且$Y \leq y$的点所占的比例。
- 方案2的问题:展平矩阵后做一维累积,会破坏二维区域的逻辑——它计算的是所有bin按一维顺序的累积和,而非
x≤a且y≤b的矩形区域内的概率和,完全不符合二维CDF的定义。 - 方案1的正确姿势:需先将PDF转换为bin的实际概率,再进行双重累积求和:
- 首先,
np.histogram2d(density=True)返回的是概率密度,每个bin的实际概率等于密度乘以bin的面积(x轴bin宽度 × y轴bin宽度)。 - 对转换后的bin概率矩阵,先沿x轴(或y轴)做累积求和,再沿另一轴做累积求和,两次累积的顺序不影响最终结果(加法交换律)。
- 首先,
代码实现示例
import numpy as np # 假设已得到hist_values, x_edges, y_edges num_bins_x = len(x_edges) - 1 num_bins_y = len(y_edges) - 1 # 计算每个bin的面积 x_bin_width = x_edges[1] - x_edges[0] y_bin_width = y_edges[1] - y_edges[0] bin_area = x_bin_width * y_bin_width # 将PDF密度转换为bin的实际概率 bin_probs = hist_values * bin_area # 计算二维CDF:双重累积求和 cdf_matrix = np.cumsum(np.cumsum(bin_probs, axis=0), axis=1) # 验证:最后一个元素应接近1(浮点误差允许小偏差) print(cdf_matrix[-1, -1])
替代方案(基于排序样本直接计算)
因为你的样本已经排序,也可以跳过直方图步骤,直接统计每个bin对应的样本占比,避免binning带来的误差:
total_samples = len(sorted_sample1) cdf_matrix = np.zeros((num_bins_x, num_bins_y)) for i in range(num_bins_x): for j in range(num_bins_y): # 统计满足x≤当前x_bin右边界且y≤当前y_bin右边界的样本数 count = np.sum((sorted_sample1 <= x_edges[i+1]) & (sorted_sample2 <= y_edges[j+1])) cdf_matrix[i, j] = count / total_samples
内容的提问来源于stack exchange,提问作者Alexandre Bloch
相关产品推荐
相关产品推荐

