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

如何使多向量直方图分箱数一致以计算Wasserstein距离?

解决StatsBase直方图固定分箱数的问题

这个问题我之前也碰到过!你遇到的核心问题是:只指定nbins=10时,fit(Histogram)会根据每批次数据的极值自动调整分箱边界,而randn(1000)生成的随机数据每次的最小/最大值都会有波动,导致分箱数偶尔出现偏差。

要确保分箱数完全一致,关键是固定分箱的边界(edges),而不是只指定分箱数量。下面给你两种实用的解决方案:

方案1:手动指定覆盖数据范围的固定分箱

如果你的数据是正态分布(比如randn生成的),可以预先定义一个覆盖数据典型范围的分箱边界,比如从-3到3(覆盖绝大多数正态分布数据),分成10个等距分箱:

using StatsBase

# 定义固定分箱边界:11个边界对应10个分箱
fixed_edges = range(-3, 3, length=11)

for i in 1:10
    h = fit(Histogram, randn(1000), fixed_edges)
    println(size(h.weights))  # 现在每次都会输出(10,)
end

方案2:基于所有数据的全局范围生成固定分箱

如果你有多个向量需要处理,且想让分箱覆盖所有数据的范围,可以先统计所有数据的全局极值,再生成对应分箱:

using StatsBase

# 假设这是你要处理的多个向量
target_vectors = [randn(1000) for _ in 1:10]

# 计算所有数据的全局最小/最大值
global_min = minimum(minimum.(target_vectors))
global_max = maximum(maximum.(target_vectors))

# 生成固定分箱(10个分箱对应11个边界)
fixed_edges = range(global_min, global_max, length=11)

# 批量生成直方图
hist_list = [fit(Histogram, vec, fixed_edges) for vec in target_vectors]

# 验证分箱数一致
foreach(hist -> println(size(hist.weights)), hist_list)  # 全部输出(10,)

这样处理后,所有直方图的分箱数完全一致,就能顺利计算它们之间的Wasserstein距离了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:09:11