【问题标题】:Determining optimal bins to bin the data确定对数据进行分箱的最佳分箱
【发布时间】:2020-07-27 02:27:16
【问题描述】:

我有 X、Y 数据,我想根据 X 值对这些数据进行分类。 但是,我想根据得到的 bin 间隔和每个 bin 的平均 Y 来确定满足条件的 X bin 的最佳数量。例如,如果我有

X=[2,3,4,5,6,7,8,9,10]
Y=[120,140,143,124,150,140,180,190,200]

我想确定满足此条件的最佳 X 箱数:Y 箱的平均值/(X 箱的 8* 宽度)应高于 20,但尽可能接近 20。箱还应是整数,例如 [1,2,..]。 我目前正在使用:

bin_means, bin_edges, binnumber = binned_statistic(X, Y, statistic='mean', bins=bins)

带有预定义的垃圾箱。但是,我想要一个可以在使用它之前为我确定最佳垃圾箱的算法。 一个小数据可以很容易地确定它,但对于数百个点,它变得很耗时。

谢谢

【问题讨论】:

  • “Y bin 的平均值”是指bin_means 的平均值?
  • 看看这是否有帮助...stats.stackexchange.com/q/798/275865
  • @RichieV 是的,Y bin 的平均值是 bin_means。我认为它必须是迭代的。感谢您发布的链接,这似乎是一个类似的问题,但我有兴趣满足这个特殊条件。而且它似乎用我不熟悉的 R 语言给出了答案
  • 嗨,你成功了吗?
  • 您好@RichieV,老实说,我没有继续使用您的代码。我设法编写了一个很长的代码来做到这一点。这个想法是从更宽的 bin 开始,然后迭代地缩小它们,直到满足条件。我的意思是它很长但服务于工作,我相信有更有效的方法。如果有兴趣,我可以发给你。

标签: pandas numpy scipy binning scipy-optimize-minimize


【解决方案1】:

如果您需要迭代以使用最小化函数找到最佳 nbins,请查看 numpy.digtize

https://numpy.org/doc/stable/reference/generated/numpy.digitize.html

然后尝试:

start = min(X)
stop = max(X)
cut_dict = {
    n: np.digitize(X, bins=np.linspace(start, stop, num=n+1))
    for n in range(min_nbins, max_nbins)}
    #input min/max_nbins
avg = {}
Y = pd.Series(Y).rename('Y')
avg = {nbins: Y.groupby(cut).mean().mean() for nbins, cut in cut_dict.items()}
avg = pd.Series(avg.values(), index=avg.keys()).rename('mean_ybins').to_frame()

然后你可以找到最接近 20 或者 20 是否是正确的数字...

【讨论】:

  • 感谢分享代码。我试图运行它,但我得到一个错误 avg = {nbins: Y.groupby(cut).mean().mean() for nbins, cut in cut_dict.items} TypeError: 'builtin_function_or_method' object is not iterable
  • 对,应该是.items()带括号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-08-15
  • 2017-11-22
  • 1970-01-01
  • 2011-01-31
  • 2014-04-03
相关资源
最近更新 更多