小编典典

使数据适合于分布?

python

我不是统计学家(更多是从事研究型Web开发的人),但是最近这些天我已经听到很多关于scipyR的信息。因此出于好奇,我想问这个问题(尽管对这里的专家来说听起来很愚蠢),因为我不确定这方面的进展,并想知道没有可靠统计背景的人们如何解决这些问题。

给定从实验中观察到的一组实数,我们可以说它们属于其中的许多分布之一(例如Weibull,Erlang,Cauchy,指数等),是否有自动找到正确分布和分布的方法?数据参数?有什么好的教程可以指导我完成该过程吗?

实际场景: 例如,假设我发起了一个小型调查,并记录了一个人每天与300个人交谈的人数信息,并且我获得以下信息:

1 10
2 5
3 20
...
...

XY告诉我在调查期间X人与Y人交谈。现在,我要使用300个人的信息,将其拟合为模型。问题归结为,是否有任何自动方法可以找到此数据的正确分布和分布参数,如果没有,是否有一个良好的逐步过程来实现这一目标?


阅读 199

收藏
2021-01-20

共1个答案

小编典典

这是一个复杂的问题,没有完美的答案。我将尝试为您提供主要概念的概述,并为您提供有关该主题的一些有用的阅读指南。

假设您有一维数据集,并且您认为可能是从中生成数据的概率分布函数集有限。您可以独立考虑每个分布,并尝试查找给定数据的合理参数。有两种为给定数据的概率分布函数设置参数的方法:

  1. 最小二乘
  2. 最大似然

以我的经验,虽然并非在每个领域都如此,但近年来,人们更倾向于“最大可能性”。

这是一个如何估计R中参数的具体示例。请考虑一组从高斯分布生成的随机点,其均值为0,标准差为1:

x = rnorm( n = 100, mean = 0, sd = 1 )

假设您知道数据是使用高斯过程生成的,但是您忘记了(或从不知道!)高斯参数。您想使用这些数据为您提供均值和标准差的合理估计。在R中,有一个标准库可以使这一过程变得非常简单:

library(MASS)
params = fitdistr( x, "normal" )
print( params )

这给了我以下输出:

      mean           sd     
  -0.17922360    1.01636446 
 ( 0.10163645) ( 0.07186782)

它们非常接近正确的答案,括号中的数字是参数周围的置信区间。请记住,每次生成一组新的点时,您都​​会得到一个新的估计答案。

在数学上,这是使用最大似然来估计高斯的均值和标准差。可能性是指(在这种情况下)“给定参数值的数据的概率”。最大似然是指“最大化生成我的输入数据的可能性的参数值”。最大似然估计是一种算法,用于找到使输入数据生成概率最大化的参数值,对于某些分布,它可能涉及数值优化算法。在R中,大部分工作是由fitdistr完成的,在某些情况下会称为optim

您可以像这样从参数中提取对数可能性:

print( params$loglik )
[1] -139.5772

使用对数可能性比避免舍入错误更常见。估计数据的联合概率涉及相乘的概率,这些概率均小于1。即使对于一小组数据,联合概率也非常快地接近0,将数据的对数概率相加就等于将概率相乘。对数似然接近0时,可能性最大,因此负数越多,数据拟合效果越差。

使用这样的计算工具,可以轻松估算任何分布的参数。考虑以下示例:

x = x[ x >= 0 ]

distributions = c("normal","exponential")

for ( dist in distributions ) {
    print( paste( "fitting parameters for ", dist ) )
    params = fitdistr( x, dist )
    print( params )
    print( summary( params ) )
    print( params$loglik )
}

指数分布不会生成负数,因此我在第一行中将其删除。输出(是随机的)如下所示:

[1] "fitting parameters for  normal"
      mean          sd    
  0.72021836   0.54079027 
 (0.07647929) (0.05407903)
         Length Class  Mode   
estimate 2      -none- numeric
sd       2      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -40.21074
[1] "fitting parameters for  exponential"
     rate  
  1.388468 
 (0.196359)
         Length Class  Mode   
estimate 1      -none- numeric
sd       1      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -33.58996

实际上,指数分布比正态分布更有可能生成此数据,这可能是因为指数分布不必将任何概率密度分配给负数。

当您尝试使数据适合更多分布时,所有这些估计问题都会变得更加严重。具有更多参数的分布更加灵活,因此与具有较少参数的分布相比,它们将更适合您的数据。同样,某些分布是其他分布的特例(例如,指数Gamma的特例)。因此,使用先验知识将您的选择模型限制为所有可能模型的子集非常普遍。

解决参数估计中一些问题的一种技巧是生成大量数据,而将某些数据留给交叉验证。要交叉验证参数对数据的拟合度,请将一些数据排除在估计过程之外,然后在遗漏的数据上测量每个模型的可能性。

2021-01-20