试图从SciPy中的分布中提取随机数,就像使用stats.norm.rvs一样。然而,我试图从我的经验分布中提取数字-这是一个偏斜的数据集,我想将偏斜和峰度合并到我所提取的分布中。理想情况下,我只想调用stats.norm.rvs(loc=blah,scale=blah,size=blah),然后除了设置均值和方差外,还设置偏斜和kurt。范数函数采用由"mvsk"的一些排列组成的"矩"自变量,其中s和k代表偏斜和峰度,但显然所做的只是要求从rv计算s和k,而我想首先将s和k确定为分布的参数。
无论如何,我不是一个统计专家,也许这是一个简单或误导的问题。如果有任何帮助,我将不胜感激。
编辑:如果四个矩不足以很好地定义分布,那么有没有其他方法可以绘制出与如下经验分布一致的值:https://i.stack.imgur.com/zia1r.png
如果您不担心进入分发的尾部,并且数据是浮点,那么你可以从经验分布中取样。
- 对数据进行排序
- 将0挂起到数据
- 设N表示该data_array的长度
- 计算q=scipy.rand()*N
- idx=int(q);di=q-idx
- xlo=数据数组[idx],xhi=数据数组[idx+1]
- 返回xlo+(xhi xlo)*di
基本上,这是在经验CDF中进行线性插值,以获得随机变量。
两个潜在的问题是(1)如果你的数据集很小,你可能无法代表分布良好,并且(2)您不会生成大于最大值的值现有数据集中的一个。
为了超越这些,你需要看看参数分布,比如上面提到的伽马分布。
正态分布只有两个参数,均值和方差。正态分布有4个参数的扩展,附加了偏斜和峰度。一个例子是Gram-Charlier展开,但据我所知,scipy中只有pdf,而不是rvs。
作为替代方案,scipy.stats中有4个参数的分布,如johnsonsu,它们是灵活的,但具有不同的参数化。
然而,在您的示例中,分布是针对大于零的值,因此近似正态分布不会很好地工作。正如Andrew所建议的,我认为你应该仔细研究scipy.stats中下界为零的分布,比如gamma,你可能会发现一些接近的分布。
如果您的样本足够大,另一种选择是使用gaussian_kde,它也可以创建随机数。但是gaussian_kde也不是为具有有限界的分布而设计的。
也许我误解了,我当然不是统计专家,但你的图像看起来有点像伽马分布。
Scipy包含一个专门针对伽马分布的代码-http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma
如果需要,简短回答替换为其他分发:
n = 100
a_b = [rand() for i in range(n)]
a_b.sort()
# len(a_b[:int(n*.8)])
c = a_b[int(n*.8)]
print c