【问题标题】:Seaborn distplot: fit distribution with some fixed parameresSeaborn distplot:使用一些固定参数拟合分布
【发布时间】:2018-05-30 14:14:57
【问题描述】:

我想为给定的数据数组x 拟合一些分布,比如伽玛,并绘制相应的密度函数。我可以通过seaborn.distplotscipy.stats 轻松做到这一点:

sns.distplot(x, fit = stats.gamma)

但是,假设我希望此分布的某些参数保持不变,例如 loc。当我使用来自scipy.statsfit 函数和固定的loc 时,我将其写为

stats.gamma.fit(x, floc = 0)

有没有办法在distplot 函数中将loc=0 传递给fit 并达到相同的结果?

【问题讨论】:

    标签: python matplotlib seaborn data-fitting


    【解决方案1】:

    sns.distplot(x, fit = stats.gamma) 确实会显示合理的情节并且stats.gamma.fit(x, loc = 0) 会给出所需统计数据的条件下,您可以通过fit_kws 提供参数:

    sns.distplot(x, fit = stats.gamma, fit_kws={"loc" : 0})
    

    [此答案基于阅读 the documentation 并且未经测试,因为问题中没有给出用例。]

    【讨论】:

    • 不。 AttributeError: Unknown property floc
    • 正如答案所说,“在条件下......”。现在看来问题中有错误。它应该是 loc 而不是 floc
    【解决方案2】:

    最简单的方法是不使用 distplot 绘制拟合,而是使用 in this post 描述的方法。提供的简单示例:

    import matplotlib.pyplot as plt
    import pandas as pd
    from scipy import stats
    import numpy as np
    
    df = pd.DataFrame(np.random.gamma(2, scale=2, size=5000),
                      columns=['samples'])
    
    params = stats.gamma.fit(df.samples, loc=0)
    xvals = np.linspace(0, df.samples.max())
    pdf = lambda x: stats.gamma.pdf(xvals, *params)
    yvals = pdf(xvals)
    
    fig, ax1 = plt.subplots()
    
    df.samples.hist(bins=20, ax=ax1, normed=True, label='Samples',
                    grid=False, edgecolor='k')
    
    plt.plot(xvals, yvals, axes=ax1, c='r', label='Fit')
    ax1.legend()
    

    这将导致类似... not enough rep to embed

    【讨论】:

      【解决方案3】:

      这是个好问题。 要找到给定数据集的 Gamma 分布近似值,可以使用似然函数。这是配方的链接。 https://en.wikipedia.org/wiki/Gamma_distribution 在这里,我根据给定的 gamma 参数生成了一些随机数。然后我使用数据和最大似然来找到分布的参数。

      import numpy as np
      from scipy.special import psi
      import matplotlib.pyplot as plt
      import seaborn as sns
      from scipy.optimize import fsolve
      
      # Generating Random variable based on Gamma dist:
      
      shape, scale = 3., 5.  # 
      s = np.random.gamma(shape, scale, 1000)
      
      plt.hist(s, 50, density=True)
      
      
      # Solving Liklihood:
      Log_s=np.log(s)
      Mean_s=np.mean(s)
      Size_s=np.size(s)
      
      k=fsolve(lambda k: np.log(k)-psi(k)-np.log(Mean_s)+(1/Size_s)*np.sum(Log_s),.1)
      theta=Mean_s/k
      
      sns.distplot(np.random.gamma(k, theta, 1000), hist=False, label='Gamma')
      
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2015-10-03
        • 2014-03-03
        • 2018-02-13
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        相关资源
        最近更新 更多