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

如何统一直方图区间后使用给定方法计算两个直方图的重叠面积?

统一直方图 bins 并计算重叠面积的解决方案

要解决两个直方图bin edges不一致的问题,核心是基于两个数据集的全局范围生成统一的bins,再重新计算直方图,具体步骤如下:

1. 确定全局数值范围

合并两个数据集的目标列,找到全局的最小值和最大值,确保统一的bins能覆盖所有数据:

# 提取两个数据集的目标列数据
data_col1 = data1.iloc[:, 1]
data_col2 = data2.iloc[:, 1]

# 计算全局的最小、最大值
global_min = min(data_col1.min(), data_col2.min())
global_max = max(data_col1.max(), data_col2.max())

2. 生成统一的bin edges

基于全局范围生成固定数量的bin edges(比如保持原有的50个bins):

num_bins = 50
# 生成统一的bin edges
unified_bins = np.linspace(global_min, global_max, num_bins + 1)

3. 用统一bins重新计算直方图

使用统一的bins重新计算两个数据集的直方图,确保hist_data1、hist_data2对应同一组bin edges:

hist_data1, _ = np.histogram(data_col1, bins=unified_bins, density=True)
hist_data2, _ = np.histogram(data_col2, bins=unified_bins, density=True)

4. 计算直方图重叠面积

直接调用你参考的histogram_intersection函数(注意导入numpy),传入统一的bins和重新计算的直方图数据:

import numpy as np

def histogram_intersection(h1, h2, bins):
    bin_widths = np.diff(bins)
    total_overlap = 0
    for width, h1_val, h2_val in zip(bin_widths, h1, h2):
        # 每个bin的重叠面积是宽度乘以两个直方图密度的较小值
        total_overlap += width * min(h1_val, h2_val)
    return total_overlap

# 计算重叠面积
overlap_area = histogram_intersection(hist_data1, hist_data2, unified_bins)
print(f"直方图重叠面积:{overlap_area}")

关键说明

  • 统一bins时必须覆盖两个数据集的全部范围,避免部分数据被截断导致计算偏差;
  • 保持density=True参数,确保直方图曲线下面积为1,重叠面积的结果具备可比性;
  • 原函数中的循环可以用numpy向量化操作优化,提升效率(可选):
    def histogram_intersection(h1, h2, bins):
        bin_widths = np.diff(bins)
        return np.sum(bin_widths * np.minimum(h1, h2))
    

内容的提问来源于stack exchange,提问作者tgwsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:42:34