用scipy.stats模块生成概率分布

一、介绍

在scipy.stats中,离散型随机变量都是rv_discrete的派生类的对象,而所有的连续型随机变量都是rv_continuous的派生类的对象。

1、离散型随机变量及分布

1
2
3
from scipy import stats
print([k for k, v in stats.__dict__.items()
if isinstance(v, stats.rv_discrete)])
分布名称 关键字 调用方式
二项分布 binom.pmf binom.pmf(x,n,p) 计算x处的概率
几何分布 geom.pmf geom.pmf(x,p) 计算第x处首次成功的概率
泊松分布 poisson.pmf poisson.pmf(x,lambda) 计算x处的概率

2、连续型随机变量及分布

1
2
3
from scipy import stats
print([k for k, v in stats.__dict__.items()
if isinstance(v, stats.rv_continuous)])
分布名称 关键字 调用方式
均匀分布 uniform.pdf uniform.pdf(x,a,b) [a,b]区间上的均匀分布
指数分布 expon.pdf expon.pdf(x,theta) 期望为theta的指数分布
正态分布 norm.pdf norm.pdf(x,mu,sigma) 均值为mu,标准差为sigma的正态分布
卡方分布 chi2.pdf chi2.pdf(x,n) 自由度为n的卡方分布
t分布 t.pdf t.pdf(x,n) 自由度为n的t分布
F分布 f.pdf f.pdf(x,m,n) 自由度为m,n的F分布
伽马分布 gamma.pdf gamma.pdf(x,A,B) 形状参数为A,尺度参数为B的伽马分布

二、示例

例:在一个图形界面上画4个不同的伽马分布的概率密度曲线。

1
2
3
4
5
6
7
8
9
10
11
from matplotlib.pyplot import plot, legend, show
from scipy.stats import gamma
from numpy import linspace

x = linspace(0,15,100)
plot(x, gamma.pdf(x,4,0,2), 'r*-', label="$\\alpha=4, \\beta=2$")
plot(x, gamma.pdf(x,4,0,1), 'bp-', label="$\\alpha=4, \\beta=1$")
plot(x, gamma.pdf(x,4,0,0.5), '.k-', label="$\\alpha=4, \\beta=0.5$")
plot(x, gamma.pdf(x,2,0,0.5), '>g-', label="$\\alpha=2, \\beta=0.5$")
legend()
show()

例:把4个不同正态分布的密度函数画在4个子窗口中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

mu0 = [-1, 0]
s0 = [0.5, 1]
x = np.linspace(-7, 7, 100)

f, ax = plt.subplots(len(mu0), len(s0), sharex=True, sharey=True)
for i in range(2):
for j in range(2):
mu = mu0[i]; s = s0[j]
y = norm(mu, s).pdf(x)
ax[i,j].plot(x, y)
ax[i,j].plot(1, 0, label="$\\mu$ = {:3.2f}\n$\\sigma$ = {:3.2f}".format(mu,s))
ax[i,j].legend(fontsize=12)
ax[1,1].set_xlabel('$x$')
ax[0,0].set_ylabel('pdf($x$)')
plt.show()

例:画出二项分布b(5, 0.4)的分布律的”火柴杆”图。

1
2
3
4
5
6
7
8
9
10
from scipy.stats import binom
import matplotlib.pyplot as plt
import numpy as np

n, p=5, 0.4
x=np.arange(6)
y=binom.pmf(x,n,p)
plt.plot(x, y, 'ro')
plt.vlines(x, 0, y, 'k', lw=3, alpha=0.5) # vlines(x, ymin, ymax)画竖线图
plt.show()
0%