找到最佳拟合值列表的随机方法
我有一串浮点数,这些数字代表了某个操作的长度,这个操作进行了好几次。
对于每种操作,我的数据趋势都不一样。
我知道在一些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最小二乘法拟合的例子 的参考链接。