【问题标题】:What parameters does truncnorm fit return?truncnorm fit 返回什么参数?
【发布时间】:2022-10-17 08:30:44
【问题描述】:

当我使用 scipy 的 truncnorm fit 时,即 truncnorm.fit(my_array) 我得到一个元组形式的答案,例如:

(1.5380758023189927, 3.6988860591528123, -0.05604604029264389, 0.03643906250110476)

我认为这类似于 min/max/mean/stddev,但是这些数字实际上都没有对应于这个数组的任何类似的东西。我对 truncnorm fit 到底给了我什么感到困惑。 Scipy 文档对此似乎不太清楚,至于 fit 方法,它似乎将我引导至 https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.fit.html,它适用于所有类型的分布,并且没有详细说明个别分布。

谁能告诉我 truncnorm fit 返回的参数/值是什么?

【问题讨论】:

    标签: python scipy statistics distribution


    【解决方案1】:

    fit 方法估计参数化分布所需的值,而不是分布的统计数据。事实上,rv_continuous 的文档指出:

    parameter_tuple:浮点数元组。 任何形状参数的估计值(如果适用),然后是位置和比例的估计值......

    truncnorm 分布有两个 shape 参数,ab。因此,您收到的元组是:(fitted_a, fitted_b, fitted_loc, fitted_scale)。这些是首先创建截断正态分布所需的值。 truncnorm 文档清楚地说明了 ab 是什么。下面演示了从查看 PDF、从该分布生成随机变量、返回到估计该分布的参数的往返过程。

    import numpy as np
    from scipy.stats import truncnorm
    import matplotlib.pyplot as plt
    
    myclip_a = 0.5
    myclip_b = 2.5
    loc = 1.3
    scale = 1.1
    a, b = (myclip_a - loc) / scale, (myclip_b - loc) / scale
    
    x = np.linspace(-2, 4, 100)
    
    # create a graph of how a, b, loc, scale are used to parameterise the truncnorm PDF.
    plt.plot(x, truncnorm.pdf(x, a, b, loc, scale),
             'r-', lw=5, alpha=0.6, label='truncnorm pdf')
    

    # create some random variates that obey that truncated normal distribution
    noise = truncnorm.rvs(a, b, loc, scale, size=1000000)
    
    # histogram the random variates to visualise the truncated normal distribution.
    plt.hist(noise, bins=100);
    

    # now estimate what the values of a, b, loc, scale are from the random variates
    fit_a, fit_b, fit_loc, fit_scale = truncnorm.fit(noise, -1,1.2, loc=1, scale=1)
    
    fit_myclip_a = fit_a*fit_scale + fit_loc
    fit_myclip_b = fit_b*fit_scale + fit_loc
    
    print(f"Original myclip_a: {myclip_a}, fit_myclip_a: {fit_myclip_a}")
    print(f"Original myclip_b: {myclip_b}, fit_myclip_b: {fit_myclip_b}")
    print(f"Original loc: {loc}, fit_loc: {fit_loc}")
    print(f"Original scale: {scale}, fit_scale: {fit_scale}")
    

    输出是:

    Original myclip_a: 0.5, fit_myclip_a: 0.5000021691860824
    Original myclip_b: 2.5, fit_myclip_b: 2.499998152872373
    Original loc: 1.3, fit_loc: 1.243679897703037
    Original scale: 1.1, fit_scale: 0.9391439098572698
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2020-11-04
      • 2012-04-24
      相关资源
      最近更新 更多