gpt4 book ai didi

python - 将数据拟合到分布?

转载 作者:IT老高 更新时间:2023-10-28 22:14:25 32 4
gpt4 key购买 nike

我不是统计学家(更多的是研究型网络开发人员),但我听说了很多关于 scipy 的信息。和 R这些日子。因此,出于好奇,我想问这个问题(尽管这对这里的专家来说可能听起来很愚蠢),因为我不确定该领域的进展情况,并且想知道没有健全的统计背景的人如何解决这些问题。

给定从实验中观察到的一组实数,假设它们属于众多分布之一(如 Weibull、Erlang、Cauchy、Exponential 等),是否有任何自动方法可以找到正确的分布和分布数据的参数?有没有什么好的教程可以引导我完成整个过程?

真实场景:
例如,假设我发起了一项小型调查并记录了一个人每天与多少人交谈的信息,例如 300 人,我有以下信息:

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

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

最佳答案

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

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

  • Least Squares
  • Maximum Likelihood

  • 根据我的经验,近年来,最大似然法一直是首选,尽管并非在每个领域都如此。

    这是一个如何在 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

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

    当您尝试将数据拟合到更多分布时,所有这些估计问题都会变得更糟。具有更多参数的分布更灵活,因此它们比具有更少参数的分布更适合您的数据。此外,一些分布是其他分布的特例(例如, ExponentialGamma 的特例)。因此,使用先验知识将您的选择模型限制为所有可能模型的子集是很常见的。

    解决参数估计中的一些问题的一个技巧是生成大量数据,并将一些数据留给 cross-validation。 .要交叉验证参数与数据的拟合情况,请在估计过程中保留一些数据,然后测量每个模型在保留数据上的可能性。

    关于python - 将数据拟合到分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290081/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com