1.随机变量及分布
NumPy
能生成一定概率分布的随机数,但如果需要更具体的概率密度,分布函数等,就用用到 scipy.stats
模块了。Python
做简单的统计分析也可以使用scipy.stats
模块,第4章再详细介绍。
scipy.stats
模块包含了多种概率分布的随机变量,随机变量分为连续型和离散型两种。所有的连续型随机变量都是rv_continuous
的派生类的对象,而所有的离散型随机变量都是rv_discrete
的派生类的对象。
1.1连续型随机变量及分布
可以使用下面的语句获得scipy.stats
模块中所有的连续型随机变量:
from scipy import stats
[k for k, v in stats.__dict__.items() if isinstance(v, stats.rv_continuous)]
总共有90多个连续型随机变量。
连续型随机变量对象都有如下方法:
rvs:产生随机数,可以通过size参数指定输出的数组的大小。
pdf:随机变量的概率密度函数。
cdf:随机变量的分布函数。
sf:随机变量的生存函数,它的值是1-cdf。
ppf:分布函数的反函数。
stat:计算随机变量的期望和方差。
fit:对一组随机样本利用极大似然估计法,估计总体中的未知参数。
1.2离散型随机变量及分布
在scipy.stats
模块中所有描述离散分布的随机变量都从rv_discrete
类继承,也可以直接用rv_discrete
类自定义离散概率分布。
可以使用下面的语句获得scipy.stats
模块中所有的离散型随机变量:
from scipy import stats
[k for k, v in stats.__dict__.items() if isinstance(v, stats.rv_discrete)]
['binom', 'bernoulli', 'nbinom', 'geom', 'hypergeom', 'logser', 'poisson', 'planck', 'boltzmann', 'randint', 'zipf', 'dlaplace', 'skellam', 'yulesimon']
总共有14
个离散型随机变量。
离散型分布的方法大多数与连续型分布很类似,但是pdf
被更换为分布律函数pmf
。
常用离散型随机变量的分布律函数如表2.15所列。
2概率密度函数和分布律可视化
例****2.46 在一个图形界面上画****4****个不同的[图片上传失败...(image-830155-1619426723999)] 分布的概率密度曲线。
#程序文件Pex2_46.py
from pylab import plot, legend, xlabel, ylabel, savefig, show, rc
from scipy.stats import gamma
from numpy import linspace
x=linspace(0,15,100); rc('font',size=15); rc('text', usetex=True)
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(); xlabel('$x$'); ylabel('$f(x)$')
savefig("figure2_46.png",dpi=500); show()
#程序文件Pex2_47.py
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); plt.rc('font',size=15)
plt.rc('text', usetex=True); plt.rc('axes',unicode_minus=False)
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.savefig('figure2_47.png'); plt.show()
#程序文件Pex2_48_1.py
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.subplot(121); plt.plot(x, y, 'ro')
plt.vlines(x, 0, y, 'k', lw=3, alpha=0.5) #vlines(x, ymin, ymax)画竖线图
#lw设置线宽度,alpha设置图的透明度
plt.subplot(122); plt.stem(x, y, use_line_collection=True)
plt.savefig("figure2_48.png", dpi=500); plt.show()
matplotlib.pyplot
是生成图形常用的模块,它提供了matplotlib
库的绘图接口。也可以使用pylab
接口从numpy
和matplotlib.pyplot
中载入最常用的命令到当前工作空间。例2.48
的程序也可以改写为:
#程序文件Pex2_48_2.py
from scipy.stats import binom
import pylab as plt
n, p=5, 0.4
x=plt.arange(6); y=binom.pmf(x,n,p)
plt.subplot(121); plt.plot(x, y, 'ro')
plt.vlines(x, 0, y, 'k', lw=3, alpha=0.5) #vlines(x, ymin, ymax)画竖线图
#lw设置线宽度,alpha设置图的透明度
plt.subplot(122); plt.stem(x, y, use_line_collection=True)
plt.show()