【问题标题】:Generating random number for a distribution of a real data?为真实数据的分布生成随机数?
【发布时间】:2014-08-04 04:52:21
【问题描述】:

我有一组真实数据,我想用这些数据找到概率分布,然后使用它们的属性根据它们的 pdf 生成一些随机点。我的数据集示例如下:

#Mag Weight
21.9786 3.6782
24.0305 6.1120
21.9544 4.2225
23.9383 5.1375
23.9352 4.6499
23.0261 5.1355
23.8682 5.9932
24.8052 4.1765
22.8976 5.1901
23.9679 4.3190
25.3362 4.1519
24.9079 4.2090
23.9851 5.1951
22.2094 5.1570
22.3452 5.6159
24.0953 6.2697
24.3901 6.9299
24.1789 4.0222
24.2648 4.4997
25.3931 3.3920
25.8406 3.9587
23.1427 6.9398
21.2985 7.7582
25.4807 3.1112
25.1935 5.0913
25.2136 4.0578
24.6990 3.9899
23.5299 4.6788
24.0880 7.0576
24.7931 5.7088
25.1860 3.4825
24.4757 5.8500
24.1398 4.9842
23.4947 4.4730
20.9806 5.2717
25.9470 3.4706
25.0324 3.3879
24.7186 3.8443
24.3350 4.9140
24.6395 5.0757
23.9181 4.9951
24.3599 4.1125
24.1766 5.4360
24.8378 4.9121
24.7362 4.4237
24.4119 6.1648
23.8215 5.9184
21.5394 5.1542
24.0081 4.2308
24.5665 4.6922
23.5827 5.4992
23.3876 6.3692
25.6872 4.5055
23.6629 5.4416
24.4821 4.7922
22.7522 5.9513
24.0640 5.8963
24.0361 5.6406
24.8687 4.5699
24.8795 4.3198
24.3486 4.5305
21.0720 9.5246
25.2960 3.0828
23.8204 5.8605
23.3732 5.1161
25.5097 2.9010
24.9206 4.0999
24.4140 4.9073
22.7495 4.5059
24.3394 3.5061
22.0560 5.5763
25.4404 5.4916
25.4795 4.4089
24.1772 3.8626
23.6042 4.7476
23.3537 6.4804
23.6842 4.3220
24.1895 3.6072
24.0328 4.3273
23.0243 5.6789
25.7042 4.4493
22.1983 6.1868
22.3661 5.9132
20.9426 4.8079
20.3806 10.1128
25.0105 4.4296
23.6648 6.6482
25.2780 4.4933
24.6870 4.4836
25.4565 4.0990
25.0415 3.9384
24.6098 4.6057
24.7796 4.2042

我怎么能这样做?我的第一次尝试是将多项式拟合到分箱数据并找到每个幅度分箱中权重的概率分布,但我认为这可能是一种更聪明的方法。例如,使用scipy.stats.rv_continuous 从给定分布中采样数据,但我不知道它是如何工作的,并且没有足够的示例。

更新: 由于我有很多 cmets 使用KDE,所以我使用了scipy.stats.gaussian_kde,我得到了以下结果。

我想知道表示我的数据属性是否是一个好的概率分布?首先,我该如何测试它,其次,是否有可能将多个 gaussian kdescipy.stats 匹配?

【问题讨论】:

  • 您可能希望查看内核密度估计。维基百科有一个例子,使用scipy:en.wikipedia.org/wiki/…。我不太了解SCIPY实现以帮助任何进一步帮助。 span>
  • scipy.stats.gaussian_kde 有一个resample 方法从内核密度中采样

标签: python numpy statistics scipy probability-density


【解决方案1】:

(1) 如果您对这些数据的抽样分布有所了解,则将该分布拟合到数据(即通过最大似然或其他方式调整参数),然后对其进行抽样。

(2) 对于更接近经验的方法,随机选择一个数据(以相等的概率),然后假设它是一个小高斯凹凸的中心,并从该凹凸采样。这相当于构造一个核密度估计并从中采样。您必须为颠簸选择一个标准偏差。

(3) 对于完全经验方法,随机选择一个数据(以相等的概率)。这相当于假设经验分布与实际分布相同。

【讨论】:

  • 感谢您的回复。我已经更新了我的问题。你怎么看?
  • 我怎样才能确定这个概率很好地代表了我的数据和另一个问题:如果我使用scipy.stats.guassian_kde,是否有可能从估计的kde,我放另一个样本,例如Mag,然后从这个概率中提取weight的分布?
  • @Dalek “我怎么能确定这个概率很好地代表了我的数据”——你不能。所有模型都是错误的,有些是有用的(John Tukey)。由您决定什么对您的目的“有用”。
  • @Dalek “从估计的 kde 中,我放了另一个样本,例如 Mag,然后从这个概率中提取重量分布”——是的。您正在寻找的称为给定 Mag 的权重条件分布。 KDE 的条件分布可能有一个简单的形式;我不知道,但我可以解决它。如果您有兴趣,请告诉我。
  • 我最初的问题是,我知道MagWeight 之间存在潜在关系,我假设根据评论找到它的最佳方法是经验分布。所以我的下一步是根据估计的PDF 使用 KDE 为我的研究生成一个模拟目录。因此,我基于知道它们会遵循某些条件生成一些随机的Mag,然后我想使用MagPDF 对给定的weight 采样Mag。应该怎么做,你认为这是正确的做法吗?
【解决方案2】:

这些数据代表什么?

SciPy 不会帮助您决定使用哪种分发类型。这种选择取决于您的数据来自何处。一旦你决定了一个分布(或者你可以尝试几个),那么你可以轻松地对你的数据执行类似 scipy.optimize.curve_fit 的操作,以决定提供给 scipy.stats 中 pdf 类的最佳参数,以便它与您的数据匹配。然后使用 scipy 连续随机变量从您的分布中生成新点。

此外,多项式不是概率密度函数,因为它没有被归一化(对所有 x 发散的积分)。据我所知,多项式拟合对您没有帮助。

【讨论】:

  • 我可以标准化概率密度,对吧?我想找到一种基于真实数据生成模拟目录的方法,并了解具有给定大小和重量的对象的可能性有多大,并根据 errors 对我的数据进行采样>分布.
【解决方案3】:

您是否尝试过创建数据的直方图?这将使您了解密度函数的形状,此时您可以尝试将数据拟合到已知分布。一旦你有一个拟合分布,你可以生成伪随机变量以获得“健全性检查”,执行像 Kolmogorov-Smirnov 这样的非参数测试。

所以,我会采取以下步骤:

  1. 创建直方图
  2. 确定数据的特征(汇总统计等)。
  3. 尝试拟合参数分布。
  4. 尝试拟合非参数分布。
  5. 进行假设检验以评估拟合度。

【讨论】:

  • "执行像 Kolmogorov–Smirnov 一样的非参数检验。" ——这没用。如果存在任何差异并且样本足够大,则假设检验必须拒绝原假设。由于 OP 不可能知道所涉及的确切分布,因此测试的结果只能是“您有/没有足够大的样本”。这根本没有任何用处。
猜你喜欢
  • 2011-03-31
  • 2023-03-15
  • 2013-11-09
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多