这是一个复杂的问题,没有完美的答案。我将尝试为您提供主要概念的概述,并为您提供有关该主题的一些有用的阅读指南。
假设您有一维数据集,并且您认为可能是从中生成数据的概率分布函数集有限。您可以独立考虑每个分布,并尝试查找给定数据的合理参数。有两种为给定数据的概率分布函数设置参数的方法:
- 最小二乘
- 最大似然
以我的经验,虽然并非在每个领域都如此,但近年来,人们更倾向于“最大可能性”。
这是一个如何估计R中参数的具体示例。请考虑一组从高斯分布生成的随机点,其均值为0,标准差为1:
x = rnorm( n = 100, mean = 0, sd = 1 )
假设您知道数据是使用高斯过程生成的,但是您忘记了(或从不知道!)高斯参数。您想使用这些数据为您提供均值和标准差的合理估计。在R中,有一个标准库可以使这一过程变得非常简单:
library(MASS)params = fitdistr( x, "normal" )print( params )
这给了我以下输出:
meansd -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- numericsd 2 -none- numericn 1 -none- numericloglik 1 -none- numeric[1] -40.21074[1] "fitting parameters for exponential" rate 1.388468 (0.196359) Length Class Mode estimate 1 -none- numericsd 1 -none- numericn 1 -none- numericloglik 1 -none- numeric[1] -33.58996
实际上,指数分布比正态分布更有可能生成此数据,这可能是因为指数分布不必将任何概率密度分配给负数。
当您尝试使数据适合更多分布时,所有这些估计问题都会变得更加严重。具有更多参数的分布更加灵活,因此与具有较少参数的分布相比,它们将更适合您的数据。同样,某些分布是其他分布的特例(例如,指数是Gamma的特例)。因此,使用先验知识将您的选择模型限制为所有可能模型的子集非常普遍。
解决参数估计中一些问题的一种技巧是生成大量数据,而将某些数据留给交叉验证。要交叉验证参数对数据的拟合度,请将一些数据排除在估计过程之外,然后在遗漏的数据上测量每个模型的可能性。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)