这是一个复杂的问题,没有完美的答案。我将尝试概述主要概念,并为您指引一些有用的阅读材料。假设您有一维数据集,并且有一组有限的概率分布函数,您认为这些数据可能是从中生成的。您可以独立考虑每个分布,并尝试找到合理的参数,以便给定您的数据。有两种方法可以根据数据设置概率分布函数的参数:
- 最小二乘法
- 最大似然法
根据我的经验,最大似然法在最近几年中更受欢迎,尽管在每个领域可能并非如此。以下是一个具体的示例,介绍如何在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)
这些答案相当接近正确答案,括号中的数字是参数置信区间。请记住,每次生成新的数据集时,你都会得到估计值的新答案。
从数学上讲,这是使用最大似然来估计高斯分布的均值和标准差。似然意味着(在这种情况下)“给定参数值的数据概率”。最大似然意味着“使输入数据生成概率最大的参数值”。最大似然估计是找到使输入数据生成概率最大的参数值的算法,对于某些分布,它可以涉及numerical optimization算法。在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
指数分布比正态分布更有可能生成这些数据,这很可能是因为指数分布不必将任何概率密度分配给负数。
当您尝试将数据拟合到更多的分布时,所有这些估计问题都会变得更糟。具有更多参数的分布更加灵活,因此它们将比具有较少参数的分布更好地适合您的数据。此外,某些分布是其他分布的特殊情况(例如
Exponential是
Gamma的特殊情况)。因此,使用先前知识来限制您的选择模型的子集非常常见。
解决一些参数估计问题的技巧是生成大量数据,并留出一些数据进行
cross-validation。为了交叉验证参数对数据的拟合,可以在估计过程中留出一些数据,然后测量每个模型在留出的数据上的可能性。