4

尝试从 SciPy 中的分布中提取随机数,就像使用 stats.norm.rvs 一样。但是,我试图从我拥有的经验分布中获取数字 - 这是一个倾斜的数据集,我想将倾斜和峰度合并到我从中提取的分布中。理想情况下,我只想调用 stats.norm.rvs(loc=blah,scale=blah,size=blah) ,然后除了均值和方差之外还设置偏斜和库尔特。norm 函数采用“moments”参数,该参数由“mvsk”的某种排列组成,其中 s 和 k 代表偏斜和峰度,但显然所做的只是要求从 rv 计算 s 和 k,而我想建立 s 和 k 作为开始的分布参数。

无论如何,我无论如何都不是统计专家,也许这是一个简单或被误导的问题。将不胜感激任何帮助。

编辑:如果四个时刻不足以很好地定义分布,是否有任何其他方法可以绘制与经验分布一致的值,如下所示:http: //i.imgur.com/3yB2Y.png

4

4 回答 4

1

正态分布只有两个参数,均值和方差。正态分布的扩展有 4 个参数,另外还有偏斜和峰度。一个例子是 Gram-Charlier 扩展,但据我记得只有 pdf 可用于 scipy,而不是 rvs。

作为替代方案,scipy.stats 中的分布具有 4 个参数,例如 johnsonsu,它们很灵活,但具有不同的参数化。

但是,在您的示例中,分布适用于大于零的值,因此近似正态分布不会很好地工作。正如 Andrew 所建议的那样,我认为您应该查看 scipy.stats 中下限为零的分布,例如伽马,您可能会发现一些接近的东西。

如果您的样本足够大,另一种选择是使用 gaussian_kde,它也可以创建随机数。但是 gaussian_kde 也不是为有限界分布而设计的。

于 2012-03-25T17:06:43.223 回答
1

如果您不担心陷入分布的尾部,并且数据是浮点数,那么您可以从经验分布中采样。

  • 对数据进行排序。
  • 在数据前附加一个 0。
  • 让 N 表示这个 data_array 的长度
  • 计算 q=scipy.rand()*N
  • idx=int(q); di=q-idx
  • xlo=data_array[idx], xhi=data_array[idx+1];
  • 返回 xlo+(xhi-xlo)*di

基本上,这是在经验 CDF 中线性插值以获得随机变量。

两个潜在的问题是(1)如果您的数据集很小,您可能无法很好地表示分布,以及(2)您不会生成大于现有数据集中最大的值。

要超越这些,您需要查看参数分布,例如上面提到的伽马分布。

于 2012-07-02T22:14:38.590 回答
0

也许我误解了,我当然不是统计专家,但你的图像看起来有点像伽马分布

Scipy 包含专门用于伽马分布的代码 - http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma

于 2012-03-25T08:07:28.240 回答
0

如果需要,简短的回答替换为其他发行版:

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
于 2014-09-09T13:44:36.127 回答