Python 拟合和绘制对数正态分布

Python 拟合和绘制对数正态分布,python,numpy,scipy,Python,Numpy,Scipy,我在做一些相对简单的事情时遇到困难,比如: 从具有一定均值和方差的高斯分布中抽取N个样本 将日志记录到这些N个样本中 拟合对数正态分布(使用stats.lognorm.Fit) 在没有inf值的情况下(使用stats.lognorm.pdf)写出一个漂亮平滑的对数正态pdf 下面是我得到的输出的一个小的工作示例: from scipy import stats import numpy as np import matplotlib.pyplot as plt import math %mat

我在做一些相对简单的事情时遇到困难,比如:

  • 从具有一定均值和方差的高斯分布中抽取N个样本
  • 将日志记录到这些N个样本中
  • 拟合对数正态分布(使用stats.lognorm.Fit)
  • 在没有inf值的情况下(使用stats.lognorm.pdf)写出一个漂亮平滑的对数正态pdf
  • 下面是我得到的输出的一个小的工作示例:

    from scipy import stats
    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    %matplotlib inline
    
    
    def lognormDrive(mu,variance):
        size = 1000
        sigma = math.sqrt(variance)
        np.random.seed(1)
        gaussianData = stats.norm.rvs(loc=mu, scale=sigma, size=size)
        logData = np.exp(gaussianData)
        shape, loc, scale = stats.lognorm.fit(logData, floc=mu)
        return stats.lognorm.pdf(logData, shape, loc, scale)
    
    plt.plot(lognormDrive(37,0.8))
    

    正如你可能注意到的,这个情节毫无意义

    有什么想法吗

    我关注了以下帖子:

    提前谢谢

    精化:我正在构建一个小脚本

  • 获取原始数据并拟合核分布(经验分布)
  • 根据数据的均值和方差假设不同的分布。这将是高斯分布和对数正态分布
  • 使用interact将这些分布与温度分布一起绘制
  • 当转动均值和方差旋钮时,计算不同分布之间的Kullbeck-Leibler散度(最终为歪斜)

  • 在对
    lognorm.fit()
    的调用中,使用
    floc=0
    ,而不是
    floc=mu

    (lognorm分布的位置参数只是转换分布。你几乎不想用对数正态分布来做这件事。)

    顺便说一句,您正在打印未排序样本值的PDF,因此更正脚本中的打印看起来不会有太大不同。您可能会发现根据排序的值绘制PDF更有用。以下是对脚本的修改,该脚本使用已排序的示例创建PDF绘图:

    from scipy import stats
    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    
    def lognormDrive(mu,variance):
        size = 1000
        sigma = math.sqrt(variance)
        np.random.seed(1)
        gaussianData = stats.norm.rvs(loc=mu, scale=sigma, size=size)
        logData = np.exp(gaussianData)
        shape, loc, scale = stats.lognorm.fit(logData, floc=0)
        print "Estimated mu:", np.log(scale)
        print "Estimated var: ", shape**2
        logData.sort()
        return logData, stats.lognorm.pdf(logData, shape, loc, scale)
    
    x, y = lognormDrive(37, 0.8)
    plt.plot(x, y)
    plt.grid()
    plt.show()
    
    脚本打印:

    Estimated mu: 37.0347152587
    Estimated var:  0.769897988163
    
    并创建以下绘图: