scipy.stats里面有大量已经封装好的随机变量,取用十分方便。
随机变量
from scipy import stats
# 连续分布
rv = stats.uniform(loc=1, scale=3) # 均匀分布,loc是最小值,loc+scale是最大值,例子是1~4之间的均匀分布
rv = stats.norm(loc=1, scale=3) # 均值和标准差(注意,不是方差)
rv = stats.chi2(df=4)
rv = stats.t(df=4)
rv = stats.f(dfn=3, dfd=5)
rv = stats.gamma(a=4)
# 离散分布
rv = stats.randint(low=0, high=2) # 含头不含尾,例子是0-1分布
...
更多随机变量,参见scipy官网
使用1
rv.rvs(size=(5,2),random_state=2) # 生成随机数
rv.stats(moments='mvsk') #'m'=mean,'v'=variance,'s'=skew,'k'=kurtosis
rv.entropy() # 返回随机变量的entropy
rv.moment(n=3) # n阶原点距(n-th order non-central moment of distribution)
#rv.median # 中心,也就是0.5分位点
#rv.mean 均值
#rv.var 方差
#rv.std 标准差
# rv.interval(alpha=0.95) # 返回一个tuple (x1,x2), (x1,x2)范围内的概率为alpha,左右两边概率相等,等价于 (rv.ppf((1-alpha)/2),rv.ppf((1+alpha)/2))
使用2
方法 | 解释 |
---|---|
pdf(x) | Probability density function. |
cdf(x) | Cumulative distribution function. |
sf(x) | Survival function (also defined as 1 - cdf). |
ppf(q) | Percent point function (inverse of cdf — percentiles). |
isf(q) | Inverse survival function (inverse of sf). |
logpdf(x) | Log of the probability density function. |
logcdf(x) | Log of the cumulative distribution function. |
logsf(x) | Log of the survival function. |
要点:
cdf逆ppf
pdf
sf=1-cdf逆isf
入参可以是数字,也可以是 array
fit专题
用MLE方法,根据样本,估计随机变量的参数
from scipy import stats
stats.norm.fit(data=[1,2,2,2]) # 返回用似然函数估计的 (loc,scale)
# 使用f0,f1,fa,fb,fcol,fscale等,可以固定某些参数,仍然用MLE方法去计算参数
stats.norm.fit(data=[1,2,2,2],floc=0)
# beta分布的参数是a,b ,既可以固定a,b,也可以固定col,scale
a,b,loc,scale=stats.beta.fit(data=[1,2,3,2],fa=1)
a,b,loc,scale=stats.beta.fit(data=[1,2,3,2],fcol=1)
expect专题
计算$Ef(X)=\int_{lb}^{ub} f(x) pdf(x) dx$
from scipy import stats
rv=stats.t(df=5)
rv.expect(func=lambda x:x,lb=-1,ub=3)
# 如果lb,ub为None,就设定为能取到的最大值
# 也可以这样写:
stats.norm.expect(func=lambda x:x,loc=0,scale=3,lb=-1,ub=3)
小试
小试1
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
mean, var, skew, kurt = norm.stats(moments='mvsk')
x = np.linspace(norm.ppf(0.01),norm.ppf(0.99), 100)
ax.plot(x, norm.pdf(x),'r-', lw=5, alpha=0.6, label='norm pdf')
plt.show()
小试2
用rv = norm(loc=5,scale=2)一次设定参数,之后便可以rv代表这一个随机变量一直用下去
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
rv = norm(loc=5,scale=2)
x = np.linspace(rv.ppf(0.01),rv.ppf(0.99), 100)
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
r = rv.rvs(size=1000)
ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()