找到最佳拟合值列表的随机方法

0 投票
4 回答
701 浏览
提问于 2025-04-16 16:22

我有一串浮点数,这些数字代表了某个操作的长度,这个操作进行了好几次。

对于每种操作,我的数据趋势都不一样。

我知道在一些Python模块中有很多随机数生成器,比如numpy.random。

例如,我有 binomial(二项分布)、exponencial(指数分布)、normal(正态分布)、weibul(威布尔分布)等等。

我想知道有没有办法找到最适合我这些数字列表的 random generator(随机数生成器),也就是哪个生成器(以及它的参数)最能符合我列表中的数字趋势。

这样我就可以自动生成每个操作的时间长度,模拟它持续 n 年,而不需要手动去找出哪个方法最适合哪个数字列表。

编辑:换句话说,我想更清楚地说明这个问题:

我有一串数字。我想找出最适合我已有数字数组的概率分布。唯一的问题是,每种概率分布都有输入参数,这些参数可能会影响结果。所以我需要想办法自动输入这些参数,以尽量符合这个列表。

有什么想法吗?

4 个回答

0

加布里埃尔,如果你能使用Mathematica,那么参数估计这个功能是自带的:

In[43]:= data = RandomReal[ExponentialDistribution[1], 10]

Out[43]= {1.55598, 0.375999, 0.0878202, 1.58705, 0.874423, 2.17905, \
0.247473, 0.599993, 0.404341, 0.31505}

In[44]:= EstimatedDistribution[data, ExponentialDistribution[la], 
 ParameterEstimator -> "MaximumLikelihood"]

Out[44]= ExponentialDistribution[1.21548]

In[45]:= EstimatedDistribution[data, ExponentialDistribution[la], 
 ParameterEstimator -> "MethodOfMoments"]

Out[45]= ExponentialDistribution[1.21548]

不过,找出最大似然法的命令其实也不难。

In[48]:= Simplify[
 D[LogLikelihood[ExponentialDistribution[la], {x}], la], x > 0]

Out[48]= 1/la - x

所以,指数分布的估计参数可以用sum (1/la -x_i)来计算,其中la = 1/Mean[data]。对于其他分布类型,也可以用类似的公式来计算,并用你喜欢的编程语言来实现。

1

使用随机数来解决这个问题为什么不好,之前已经解释过了。看起来你真正需要的是把你提到的分布模型适配到你的数据点上(比如,可以用最小二乘法来拟合),然后再检查哪个模型最适合这些数据点(比如,可以用卡方检验来判断)。

编辑 添加了一个关于 numpy最小二乘法拟合的例子 的参考链接。

3

你可以把这个问题想得简单一点,考虑概率分布,而不是随机数生成器。这样你就可以测试不同分布的适合度。

作为一个起点,你可以尝试为你的样本构建概率图。在数学上,最简单的方式可能是考虑Q-Q图。使用随机数生成器,创建一个和你的数据大小相同的样本。把这两个样本排序,然后相互绘制。如果这两个分布是一样的,你应该会得到一条直线。

编辑:为了找到统计模型的合适参数,通常使用最大似然估计的方法。根据你有多少个样本和你需要的精度,你可能会发现手动调整参数就能得到一个“足够好”的结果。

撰写回答