直方图拟合 python
Histogram fitting with python
我一直在网上冲浪,但没有找到执行以下操作的正确方法。
我用 matplotlib 做了一个直方图:
hist, bins, patches = plt.hist(distance, bins=100, normed='True')
从图中可以看出分布或多或少呈指数分布(泊松分布)。考虑到我的 hist 和 bins 数组,我怎样才能最合适?
更新
我正在使用以下方法:
x = np.float64(bins) # Had some troubles with data types float128 and float64
hist = np.float64(hist)
myexp=lambda x,l,A:A*np.exp(-l*x)
popt,pcov=opt.curve_fit(myexp,(x[1:]+x[:-1])/2,hist)
但是我明白了
---> 41 plt.plot(stats.expon.pdf(np.arange(len(hist)),popt),'-')
ValueError: operands could not be broadcast together with shapes (100,) (2,)
您所描述的是 exponential distribution 的一种形式,您希望根据数据中观察到的概率密度来估计指数分布的参数。不是使用非线性回归方法(假设残差是高斯分布的),一种正确的方法可以说是 MLE(最大似然估计)。
scipy
在其stats
库中提供了大量的连续分布,MLE是用.fit()
方法实现的。当然,指数分布是there:
In [1]:
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
#generate data
X = ss.expon.rvs(loc=0.5, scale=1.2, size=1000)
#MLE
P = ss.expon.fit(X)
print P
(0.50046056920696858, 1.1442947648425439)
#not exactly 0.5 and 1.2, due to being a finite sample
In [3]:
#plotting
rX = np.linspace(0,10, 100)
rP = ss.expon.pdf(rX, *P)
#Yup, just unpack P with *P, instead of scale=XX and shape=XX, etc.
In [4]:
#need to plot the normalized histogram with `normed=True`
plt.hist(X, normed=True)
plt.plot(rX, rP)
Out[4]:
您的 distance
将替换此处的 X
。
我一直在网上冲浪,但没有找到执行以下操作的正确方法。
我用 matplotlib 做了一个直方图:
hist, bins, patches = plt.hist(distance, bins=100, normed='True')
从图中可以看出分布或多或少呈指数分布(泊松分布)。考虑到我的 hist 和 bins 数组,我怎样才能最合适?
更新
我正在使用以下方法:
x = np.float64(bins) # Had some troubles with data types float128 and float64
hist = np.float64(hist)
myexp=lambda x,l,A:A*np.exp(-l*x)
popt,pcov=opt.curve_fit(myexp,(x[1:]+x[:-1])/2,hist)
但是我明白了
---> 41 plt.plot(stats.expon.pdf(np.arange(len(hist)),popt),'-')
ValueError: operands could not be broadcast together with shapes (100,) (2,)
您所描述的是 exponential distribution 的一种形式,您希望根据数据中观察到的概率密度来估计指数分布的参数。不是使用非线性回归方法(假设残差是高斯分布的),一种正确的方法可以说是 MLE(最大似然估计)。
scipy
在其stats
库中提供了大量的连续分布,MLE是用.fit()
方法实现的。当然,指数分布是there:
In [1]:
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
#generate data
X = ss.expon.rvs(loc=0.5, scale=1.2, size=1000)
#MLE
P = ss.expon.fit(X)
print P
(0.50046056920696858, 1.1442947648425439)
#not exactly 0.5 and 1.2, due to being a finite sample
In [3]:
#plotting
rX = np.linspace(0,10, 100)
rP = ss.expon.pdf(rX, *P)
#Yup, just unpack P with *P, instead of scale=XX and shape=XX, etc.
In [4]:
#need to plot the normalized histogram with `normed=True`
plt.hist(X, normed=True)
plt.plot(rX, rP)
Out[4]:
您的 distance
将替换此处的 X
。