经典回顾
分布函数(Cumulative Distribution Function, CDF)
设为随机变量,对于任意实数,令
称为随机变量的分布函数。分布函数满足如下性质:
- 是关于的单调不减函数
- 是右连续的
连续型随机变量的概率密度函数(Probability Density Function, PDF)
对于随机变量的分布函数,如果存在非负函数,使得对任意都有
则称随机变量是连续型随机变量,其中叫做的概率密度函数,简称为概率密度,记为.概率密度函数具有以下性质:
- 若在处连续,则
正态分布(Normal Distribution)
若随机变量具有概率密度函数
其中为常数,则称服从参数为的正态分布,记作.的分布函数为
为什么不写成初等函数的形式呢?是不喜欢吗?
Box-Muller方法
万流归一定理:设为连续型随机变量,其分布函数为,则随机变量服从(0,1)上的均匀分布。
证明:根据分布函数的定义可知
由于累积分布函数在其定义域上是单调不减函数,有
因此,的累计分布函数为
概率密度函数为
逆变换定理:设为上的连续型随机变量,且的分布函数为,随机变量,则随机变量服从与相同的分布.
证明:的累积分布函数为
由于累积分布函数在其定义域上是单调不减函数,且服从上的均匀分布,有
根据逆变换定理,我们可以从均匀分布中采样,然后通过反函数进行映射,得到服从目标分布的随机变量。但是,正态分布的累计分布函数无法表达为初等函数的形式,直接得到其反函数较为困难。Box-Muller变换是设置两个相互独立的正态分布的随机变量,得到二元分布函数,再进行极坐标变换,得到初等函数形式的分布函数。
假定是两个相互独立的随机变量,且均服从标准正态分布,则其概率密度函数为
由于二者相互独立,因此的联合概率密度函数为
根据极坐标变换公式,有
因此,的分布函数为
设相互独立,且均服从上的均匀分布,经过反函数映射为
由于,上式等价于
反函数映射为
因此,最终采样得到的为
代码实现
实现起来并不复杂,以下用JavaScript示例。
function randn(mean, std, count) {
const arr = []
for (let i = 0; i < count; i++) {
const u1 = Math.random()
const u2 = Math.random()
const standard = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2)
arr.push(standard * std + mean);
}
return arr
}