如何使多向量直方图分箱数一致以计算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
相关产品推荐
相关产品推荐

