使用 Numpy 直方图采样平坦分布

问题描述

我有一个变量 X 的分布,它具有以下形状:

enter image description here

现在,我想“展平”这个分布——也就是说,取这个分布的样本,使得这个样本的直方图完全平坦。换句话说,我想在每个 bin 中取 nkeep 点,其中 nkeep 最大化以保留最多的事件。分布存储在 Pandas 数据帧(称为 events)中,应该输出到新的数据帧。到目前为止,我已经尝试使用 numpy 直方图和一个循环来做到这一点,但取得了轻微的成功,但是,当我使用 matplotlib 绘制最终分布时,我似乎总是在第一个 bin 中得到一个很大的峰值。

这是我的代码

nbins = 50 
usebins = np.linspace(0,0.07,nbins) 
hist,edges = np.histogram(events.x,usebins)

df = pd.DataFrame() 
nkeep = hist[-1] 
for ii in range(0,len(edges) - 1 ):
    theseEvents = pd.DataFrame()
    left = edges[ii]
    right = edges[ii+1]
    theseEvents = events[(events.x >= left) & (events.x < right)].head(nkeep)
    df = df.append(theseEvents)
plt.hist(df.x,bins=nbins)
plt.title("X")
plt.show()

enter image description here

当然,如果我使用 plt.hist(df.x,bins=usebins),我可以得到它来绘制一个完全平坦的直方图,但我仍然不希望像上面那样简单地指定 bin 数量时出现峰值。更重要的是,即使我使用更多 (60) 或更少 (40) 个箱进行绘图,峰值仍然存在。关于可能会发生什么的任何想法?

我的最终目标是将此数据框用于其他任务,我希望新分布的“平坦度”尽可能独立于分箱。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)