【问题标题】:Fitting non-normpdf's to histograms in matplotlib将 non-normpdf 拟合到 matplotlib 中的直方图
【发布时间】:2014-01-01 14:40:59
【问题描述】:

我正在尝试拟合直方图,但没有任何运气。有很多关于如何在正常概率密度函数中执行此操作的信息,但对其他类型的 pdf 没有。

import pylab as py
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import exponpow

# Fit procedure
eigfit=[]
for i in range(0,len(eigenvals1)):
if eigenvals1>=4.3:
    eigfit.append(eigenvals1[i])

b = exponpow.fit(eigfit)

但我找不到如何绘制这个指数 pdf 的曲线。它为我提供了一些拟合值,但在 scipy 文档中并没有很好地解释它是如何拟合的。

【问题讨论】:

  • 问题是让数字脱离拟合还是在得到拟合后绘制拟合?

标签: python matplotlib scipy


【解决方案1】:

fit 方法执行 maximum likelihood estimation 的参数。

要拟合 exponpow 分布,您可能希望位置参数(所有 scipy 分布都具有)为 0。还有两个其他参数:比例参数和形状参数。这是一个使用exponpow.fit的示例(在ipython会话中),位置参数固定为0:

首先生成一些假数据:

In [108]: np.random.seed(123)

In [109]: samples = 5 + np.random.randn(1000)

使用exponpow.fit 使参数适合数据。使用floc=0将位置参数固定为0:

In [110]: params = exponpow.fit(samples, floc=0)

使用matplotlib.pyplot.hist绘制样本的直方图:

In [111]: histresult = hist(samples, density=True, facecolor='cyan', alpha=0.25)

绘制拟合分布的PDF,使用方法exponpow.pdf

In [112]: x = np.linspace(0, samples.max() + 1, 100)

In [113]: pdf = exponpow.pdf(x, *params)

In [114]: plot(x, pdf, 'b-', linewidth=2)
Out[114]: [<matplotlib.lines.Line2D at 0x5b59b90>]

这些是拟合参数(形状、位置、比例)的值:

In [115]: params
Out[115]: (3.5192555959521199, 0, 6.078044809594477)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多