以通用方式从scipy.stats获取pdf

gt6*_*89b 6 python distribution scipy

我正在使用scipy.statsPython 2.7.10 运行一些拟合优度测试.

for distrName in distrNameList:
    distr = getattr(distributions, distrName)
    param = distr.fit(sample)
    pdf   = distr.pdf(???)
Run Code Online (Sandbox Code Playgroud)

我将通过哪些distr.pdf()方法获取最佳拟合pdf值,并将其list称为感兴趣的样本点abscissas

ali*_*i_m 7

从文档中,该.fit()方法返回:

shape,loc,scale:浮点元组MLE用于任何形状统计,其次是位置和比例.

并且该.pdf()方法接受:

x:array_like分位数

arg1,arg2,arg3,...:array_like分布的形状参数(有关更多信息,请参阅实例对象的docstring)

loc:array_like,可选的位置参数(默认= 0)

scale:array_like,可选

所以基本上你会做这样的事情:

import numpy as np
from scipy import stats
from matplotlib import pyplot as plt


# some random variates drawn from a beta distribution
rvs = stats.beta.rvs(2, 5, loc=0, scale=1, size=1000)

# estimate distribution parameters, in this case (a, b, loc, scale)
params = stats.beta.fit(rvs)

# evaluate PDF
x = np.linspace(0, 1, 1000)
pdf = stats.beta.pdf(x, *params)

# plot
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.hist(rvs, normed=True)
ax.plot(x, pdf, '--r')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


unu*_*tbu 5

要评估pdf at abscissas,您将abcissas作为第一个参数传递给pdf.要指定参数,请使用*运算符解压缩param元组并将这些值传递给distr.pdf:

pdf = distr.pdf(abscissas, *param)
Run Code Online (Sandbox Code Playgroud)

例如,

import numpy as np
import scipy.stats as stats

distrNameList = ['beta', 'expon', 'gamma']
sample = stats.norm(0, 1).rvs(1000)
abscissas = np.linspace(0,1, 10)
for distrName in distrNameList:
    distr = getattr(stats.distributions, distrName)
    param = distr.fit(sample)
    pdf = distr.pdf(abscissas, *param)
    print(pdf)
Run Code Online (Sandbox Code Playgroud)