9 Julia语言中的随机数发生器与分布类介绍(*
)
9.1 与分布有关的函数
Julia语言的Base部分提供了rand
函数和randn
函数。
rand(n)
返回n个标准均匀分布U(0,1)随机数,
类型是Float64的一维数组,
无自变量的rand()
调用返回一个U(0,1)随机数。
randn(n)
和randn()
产生标准正态分布的随机数。
加载Distributions
包后可以生成其它分布的随机数,
为Base的rand
函数增加了方法,
还提供了各种与分布的有关函数。
产生随机数的函数调用格式为
rand(distribution, n)
或rand(distribution)
,
其中distribution
是一个分布,用函数调用表示,
比如标准正态分布用Normal()
表示,
\(\text{N}(10, 2^2)\)用Normal(10,2)
表示。
用Random.seed!(k)
设定一个随机数种子序号,
这样可以在模拟时获得可重复的结果。
比如,生成100个Possion(2)分布随机数:
结果是Int64型的一维数组。作其直方图:
using CairoMakie
CairoMakie.activate!()
using AlgebraOfGraphics
plt = data((; y = y)) * mapping(:y) * histogram()
draw(plt, axis=(; title="Random sample from Poisson(2)"))
Distributions包不仅包含了R软件中提供的密度函数、对数密度函数、分布函数、分位数函数、随机数函数等与分布有关的函数, 还可以输出每个参数分布的各种矩的理论值, 计算矩母函数和特征函数, 给定观测样本后计算参数的最大似然估计, 用共轭先验计算后验分布,对参数作最大后验密度估计等。 分布类型包括一元随机变量(Univariate)、随机向量(Multivariate)、随机矩阵(Matrixvariate), 又可分为离散型(Discrete)和连续型(Continuous)。 分布类型的大类名称包括:
- DiscreteUnivariateDistribution
- ContinuousUnivariateDistribution
- DiscreteMultivariateDistribution
- ContinuousMultivariateDistribution
- DiscreteMatrixDistribution
- ContinuousMatrixDistribution
Distributions包中定义了各种概率分布。
例如,
Binomial(n, p)
表示二项分布,
Normal(μ, σ)
表示正态分布分布,
Multinomial(n, p)
表示多项分布,
Wishart(nu, S)
表示Wishart分布。
可以从一元分布生成截断分布(truncated),
如Truncated(Normal(mu, sigma), l, u)
。
用params(distribution)
返回一个分布的参数,如
rand(distribution, n)
生成n
个指定分布的随机数,
对一元分布,结果是一维数组,
连续型分布的元素类型是Float64,
离散型分布的元素类型是Int。
对多元分布,
结果是矩阵,每列为一个抽样。
对随机矩阵分布,
结果是元素为矩阵的数组。
有一些函数用来返回分布的特征量, 对一元分布,有:
maximum()
分布的定义域上界minimum()
分布的定义域下界mean()
期望值var()
方差std()
标准差,median()
中位数modes()
众数(可有多个)mode()
第一个众数skewness()
偏度kurtosis()
峰度,正态为0entropy()
分布的熵
用mgf(distribution, t)
计算矩母函数在t
处的值,
用cf(distribution, t)
计算特征函数在t
处的值。
用pdf(distribution, x)
计算分布密度(概率质量)函数在x
处的值,
如果x
是数组,结果返回数组;
如果x
是数组且函数写成pdf!(distribution, x)
,则结果保存在x
中返回。
logpdf()
计算其密度函数的自然对数值。
用cdf(distribution, x)
计算分布函数在x
处的值,
logcdf
计算其对数值,
ccdf
计算1减分布函数值,
logccdf
计算其对数值。
用quantile(distribution, p)
计算分位数函数在p
处的值。
类似于pdf
,这些函数一般支持向量化,
输入x
为向量时返回向量,
写成以叹号结尾的函数名时,
输入为向量则结果保存在输入向量的存储中返回。
可这样向量化的函数包括
pdf
, logpdf
, cdf
, logcdf
, ccdf
, logccdf
, quantile
, cquantile
, invlogcdf
, invlogccdf
。
比如,计算\(\text{N}(10,2^2)\)的0.5和0.975分位数:
quantile(Normal(10, 2), [0.5, 0.975])
## 2-element Array{Float64,1}:
## 10.0
## 13.9199
10 + 2*quantile(Normal(), [0.5, 0.975])
## 2-element Array{Float64,1}:
## 10.0
## 13.9199
比如,计算标准正态分布密度并作曲线图:
x = range(-3.0, 3.0; length=100)
y = pdf.(Normal(), x)
plt = data((; x=x, y=y)) *
mapping(:x, :y) * visual(Lines)
draw(plt)
用rand(distrbution)
生成指定分布的一个抽样,
用rand(distrbution, n)
生成指定分布的n
个抽样,
用rand!(distribution, x)
生成指定分布的多个抽样保存在数组x
中返回。
用fit(distribution, x)
作最大似然估计,
比如模拟生成\(\text{N}(10,2^2)\)样本,然后做最大似然估计:
9.2 支持的分布
这里列举出Julia的Distributions包支持的分布。
9.2.1 连续型一元分布
Arcsine(a,b)
Beta(α,β)
BetaPrime(α,β)
Biweight(μ, σ)
Chi(ν)
Chisq(ν)
Cosine(μ, σ)
Epanechnikov(μ, σ)
Erlang(α,θ)
Exponential(θ)
FDist(ν1, ν2)
Frechet(α,θ)
Gamma(α,θ)
GeneralizedExtremeValue(μ, σ, ξ)
GeneralizedPareto(μ, σ, ξ)
Gumbel(μ, θ)
InverseGamma(α, θ)
InverseGaussian(μ,λ)
Kolmogorov()
KSDist(n)
KSOneSided(n)
Laplace(μ,θ)
Levy(μ, σ)
Logistic(μ,θ)
LogNormal(μ,σ)
NoncentralBeta(α, β, λ)
NoncentralChisq(ν, λ)
NoncentralF(ν1, ν2, λ)
NoncentralT(ν, λ)
Normal(μ,σ)
NormalCanon(η, λ)
NormalInverseGaussian(μ,α,β,δ)
Pareto(α,θ)
Rayleigh(σ)
SymTriangularDist(μ,σ)
TDist(ν)
TriangularDist(a,b,c)
Triweight(μ, σ)
Uniform(a,b)
VonMises(μ, κ)
Weibull(α,θ)
9.2.2 离散型一元分布
Bernoulli(p)
BetaBinomial(n,α,β)
Binomial(n,p)
Categorical(p)
DiscreteUniform(a,b)
Geometric(p)
Hypergeometric(s, f, n)
NegativeBinomial(r,p)
Poisson(λ)
PoissonBinomial(p)
Skellam(μ1, μ2)