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
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))
正如你可能注意到的,这个情节毫无意义
有什么想法吗
我关注了以下帖子:
提前谢谢
精化:我正在构建一个小脚本
在对
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
并创建以下绘图: