【Python】【scipy】Random Variable



2017年08月09日    Author:Guofei

文章归类: 0xa0_蒙特卡洛方法    文章编号: 10021

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2017/08/09/scipyrv.html


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()

scipyrv2.png

小试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()

scipyrv1.png


您的支持将鼓励我继续创作!