根据数组生成仅正分布

时间:2019-08-16 08:38:12

标签: python-3.x numpy scipy

我有一个数据数组,例如:

[1000,800,700,650,630,500,370,350,310,250,210,180,150,100,80,50,30,20,15,12,10,8,6,3]

根据这些数据,我想生成适合相同分布的随机数。

我可以使用如下代码生成随机数:

dist = scipy.stats.gaussian_kde(data)
randomVar = np.floor(dist.resample()[0])

这将导致生成包含负数的随机数,我相信我可以很容易地进行转储而无需更改其余曲线的整体形状(我只是生成了足够的重采样,因此在转储负数之后我仍然有足够的用途)。

但是,由于原始数据仅是正值-并且堆积在该边界上,因此我最终得到一个kde,该kde在变为零之前的一小段距离内最高,但是随着它接近零而急剧下降。 ;而且KDE中的下降标记使我无法生成适当的数字。

Example picture of downward tick

我可以设置较低的带宽,以便获得一个更接近零的尖角,但是由于原始数据量少,它最终在其他地方锯齿。不幸的是,较高的带宽会在消除向下的滴答声之前隐藏曲线的形状。

1 个答案:

答案 0 :(得分:0)

正如希尔伯特的《饮酒问题》中的评论所广泛建议的那样,真正的解决方案是找到适合参数的更好的分布。就我而言,Chi-Squared既适合曲线的形状,又适合于仅取正值的事实。

但是,在评论中Stelios提出了使用scipy.stats.rv_histogram的好建议,我曾经使用过并且对此感到满意。尽管有两个问题,这使我能够精确地拟合曲线到数据:

  • 1)在没有数据的情况下假定为零值。即如果您设置 设置太接近数据,然后出现间隙 数据将降为零而不是插值。
  • 2)作为扩展 指向第1点,它将不会超出种子数据的最大值,并且 最小值(这些数据范围实际上是巨大的差距,因此 最终归零)。