在一个图中拟合对数正态分布和正态分布

为了比较它们,我必须将对数正态分布和正态分布拟合到一个图上。我能够使我的数据正常,如下图所示。我很难添加合适的对数正态分布

http://img3.mukewang.com/64914a790001920b05730422.jpg

这是我的代码:


   mu, std = st.norm.fit(data)

   plt.hist(data, 50, density=True, facecolor='orange', alpha=0.75)

   xmin, xmax  = plt.xlim()

   x = np.linspace(xmin,xmax,100)

   p = st.norm.pdf(x, mu, std)

   plt.plot(x, p, 'k', linewidth=1.5)

   plt.show()


海绵宝宝撒
浏览 93回答 1
1回答

aluckdog

stats.lognorm与 类似stats.norm,但使用了 3 个参数。具有 3 个参数会使分布更难拟合,并且通常loc给出初始猜测为零。没有这样的初始猜测,拟合度通常很差。请注意,除了猜测,还loc可以将固定值设置为lognorm.fit(data, floc=0)。import numpy as npfrom scipy import stats as stimport matplotlib.pyplot as pltdata = 60 + (np.random.randn(50, 200)+0.2).cumsum(axis=0).ravel()lshape, lloc, lscale = st.lognorm.fit(data, loc=0)mu, std = st.norm.fit(data)plt.hist(data, 50, density=True, facecolor='orange', alpha=0.75)xmin, xmax = plt.xlim()x = np.linspace(xmin, xmax, 500)plt.plot(x, st.norm.pdf(x, mu, std), color='dodgerblue', linewidth=1.5, label='gaussian normal')plt.plot(x, st.lognorm.pdf(x, lshape, loc=lloc, scale=lscale), color='limegreen', linewidth=1.5, label='lognormal')plt.legend()plt.autoscale(enable=True, axis='x', tight=True)plt.show()PS:要试用Paul H 的库,可以安装pip install paramnormal:import paramnormallognorm_params = paramnormal.lognormal.fit(data)plt.plot(x, paramnormal.lognormal.from_params(lognorm_params).pdf(x))乍一看,对于这些示例数据,它给出了与 相同的曲线(但参数化不同)st.lognorm.fit(data, loc=0)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python