我们知道,对
X
X
X已知的分布函数
F
X
(
x
)
F_X(x)
FX(x),若函数
Y
=
g
(
X
)
Y=g(X)
Y=g(X)具有单调增加的反函数
X
=
g
−
1
(
Y
)
X=g^{-1}(Y)
X=g−1(Y),则
Y
Y
Y的分布函数
F
Y
(
y
)
=
F
X
(
g
−
1
(
y
)
F_Y(y)=F_X(g^{-1}(y)
FY(y)=FX(g−1(y)。在Python中,我们也可以通过这样的函数复合方式计算连续型随机变量函数的分布:构造
y
=
g
(
x
)
y=g(x)
y=g(x)的反函数
h
(
y
)
=
g
−
1
(
y
)
h(y)=g^{-1}(y)
h(y)=g−1(y),然后将其作为参数传递给
X
X
X的累积概率函数的自变量。
例1设
X
X
X~
U
(
a
,
b
)
U(a, b)
U(a,b)(
0
≤
a
<
b
0\leq a<b
0≤a<b),
Y
=
π
4
X
2
Y=\frac{\pi}{4}X^2
Y=4πX2,当
y
≥
0
y\geq0
y≥0时,
g
−
1
(
y
)
=
h
(
y
)
=
2
y
π
g^{-1}(y)=h(y)=2\sqrt{\frac{y}{\pi}}
g−1(y)=h(y)=2πy单调增加,所以
F
Y
(
y
)
=
F
X
(
h
(
y
)
)
=
F
X
(
2
y
π
)
F_Y(y)=F_X(h(y))=F_X(2\sqrt{\frac{y}{\pi}})
FY(y)=FX(h(y))=FX(2πy)。由于scipy.stats中的uniform就表示均匀分布,所以只需要定义好函数
g
−
1
(
y
)
=
h
(
y
)
g^{-1}(y)=h(y)
g−1(y)=h(y),
传递给uniform的cdf函数的自变量参数就可以定义
Y
Y
Y的分布了。由于
a
≥
0
a\geq0
a≥0,故可将
h
(
y
)
h(y)
h(y)定义为
h
(
y
)
=
{
0
y
<
0
2
y
π
y
≥
0
.
h(y)=\begin{cases}0&y<0\\2\sqrt{\frac{y}{\pi}}&y\geq0\end{cases}.
h(y)={02πyy<0y≥0.
下列代码实现
h
(
y
)
h(y)
h(y)的定义
def h(y):
x=np.zeros(y.size) #返回值初始化为0
d=np.where(y>=0) #y>=0的下标序列
x[d]=2*np.sqrt(y[d]/np.pi) #y>=0时对应的函数值
return x
利用上列程序定义好的函数h(y),我们定义如下的ydist分布
from scipy.stats import uniform, rv_continuous
class ydist(rv_continuous):
def _cdf(self, y, a, b):
return uniform.cdf(x=h(y), loc=a, scale=b-a)
ydist类中定义的累积概率函数cdf除了self以外的3个参数y表示自变量,a,b分别表示 X X X作为均匀分布的参数 a a a和 b b b。第4行调用uniform(均匀分布)的cdf函数,传递h(y)给参数x,a给参数loc,b-a给参数scale。计算的结果作为返回值返回。利用ydist分布,我们可以模拟 Y Y Y所描述的随机试验。
import numpy as np
from matplotlib import pyplot as plt
dist=ydist()
x=np.linspace(-2, 25, 256)
a, b=2, 5
y=dist.pdf(x,a,b)
plt.plot(x,y)
v=dist.rvs(a, b, size=200)
plt.hist(v, density=True)
plt.show()
程序的第3行用程序2.17定义的分布ydist类创建对象dist。第6行调用dist的概率密度函数pdf,传递参数a和b(第5行创建并初始化)计算横轴范围x=(-2, 25)(第4行创建)对应的函数值。第7行绘制概率密度函数的图像。第8行调用dist的rvs函数产生200个服从dist分布的随机数构成的序列v。第9行用v的数据绘制直方图。运行程序,展示下图。可见数据v很好地模拟了dist分布描述的试验。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。
返回《导引》