5

【Python】【scipy】Random Variable

 2 years ago
source link: https://www.guofei.site/2017/08/09/scipyrv.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【Python】【scipy】Random Variable

2017年08月09日

Author: Guofei

文章归类: A蒙特卡洛方法 ,文章编号: 10021


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

Edit

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

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)=∫ublbf(x)pdf(x)dxEf(X)=∫lbubf(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


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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK