【发布时间】: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