You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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的实际概率,再进行双重累积求和:
    1. 首先,np.histogram2d(density=True)返回的是概率密度,每个bin的实际概率等于密度乘以bin的面积(x轴bin宽度 × y轴bin宽度)。
    2. 对转换后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:13:29