微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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 举报,一经查实,本站将立刻删除。