【问题标题】:Generate positive only distribution based on array基于数组生成仅正分布
【发布时间】:2019-08-16 08:38:12
【问题描述】:

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

[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 中的向下刻度使我无法生成适当的数字。

我可以将带宽设置得更低,以获得更锐利的拐角,接近于零,但是由于原始数据的数量很少,它最终会在其他地方出现锯齿状。不幸的是,更高的带宽在消除向下的刻度之前会隐藏曲线的形状。

【问题讨论】:

  • 由于正态分布在实线上完全支持,我不确定是否可以使用任何直接的方法来避免负样本。您是否尝试过基于具有非负支持的发行版使用其他内核?
  • 对内核有什么建议吗? - 我很高兴不使用 normal,只要它能实现生成“看起来像”原始数据的不同大小的数组的目标。
  • 也许scipy.stats.rv_histogram 是你需要的。
  • 是否可以使用类似引导程序的方法,您只需从输入数组中采样并替换?例如。要生成n 样本,请使用sample = np.random.choice(data, size=n)
  • np.random.choice 是我以前使用的……尽管在稍微不同的上下文中;我希望在这里改进它 - 但很好的建议。我认为 rv_histrogram 有效,但我将在星期一完成双重检查。

标签: python-3.x numpy scipy


【解决方案1】:

正如希尔伯特饮酒问题在 cmets 中广泛建议的那样,真正的解决方案是找到适合参数的更好分布。在我的例子中,卡方,它既适合曲线的形状,也适合它只取正值的事实。

然而,在 cmets 中,Stelios 提出了使用 scipy.stats.rv_histogram 的好建议,我使用了一段时间并对此感到满意。这使我能够准确地将曲线拟合到数据中,尽管它有两个问题:

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

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多