为真实数据分布生成随机数?

7 投票
3 回答
1905 浏览
提问于 2025-04-18 09:42

我有一组真实的数据,想用这些数据找出一个概率分布,然后利用这个分布的特性生成一些随机点,按照它们的概率密度函数(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 从给定的分布中抽样数据,但我不知道这个方法具体怎么用,而且例子也不够多。

更新: 因为我收到了很多评论建议使用 KDE,所以我用了 scipy.stats.gaussian_kde,得到了以下结果。 enter image description here

我在想,这是否是一个好的概率分布来表示我的数据特性?首先,我该怎么测试这个分布,其次,是否有可能用 scipy.stats 拟合多个 gaussian kde

3 个回答

0

这段数据在说什么呢?

SciPy这个工具并不能帮你决定用哪种分布。选择分布的依据是你的数据来源。确定了分布类型后(你也可以尝试几种不同的),就可以用类似scipy.optimize.curve_fit这样的工具来分析你的数据,从而找到最佳的参数,这些参数可以用来输入到scipy.stats中的pdf类里,以便让它与你的数据更匹配。接着,你可以使用scipy的连续随机变量来从你的分布中生成新的数据点。

另外,单纯的多项式并不是概率密度函数,因为它没有经过标准化(对所有x的积分是发散的)。据我所知,多项式拟合对你没有帮助。

0

你有没有试过把数据做成直方图?这样可以让你了解数据的分布形状,然后你就可以尝试把这些数据和已知的分布进行匹配。一旦你找到了合适的分布,就可以生成一些伪随机数来做个“合理性检查”,还可以进行像Kolmogorov–Smirnov这样的非参数检验。

所以,我建议你按照以下步骤进行:

  1. 制作一个直方图
  2. 确定数据的特征(比如一些总结统计信息等)。
  3. 尝试匹配参数分布。
  4. 尝试匹配非参数分布。
  5. 进行假设检验来评估匹配的效果。
1

(1) 如果你对这些数据的来源有一些了解,可以尝试把这种来源的分布模型应用到数据上,也就是说,调整一些参数使得模型更符合这些数据,然后再从这个模型中抽样。

(2) 如果想用更接近实际的方法,可以随机选取一个数据点(每个数据点被选中的概率是一样的),然后假装这个点是一个小的高斯分布的中心,从这个小分布中抽样。这就相当于在构建一个核密度估计,并从中抽样。你需要为这个小分布选择一个标准差。

(3) 如果你想完全依赖实际数据,可以随机选取一个数据点(每个数据点被选中的概率是一样的)。这就相当于假设实际分布和你手头的数据分布是一样的。

撰写回答