如何计算Cholesky分解生成的相关正态样本各场景的概率
问题解答
你生成的(X,Y)属于连续型二维联合正态分布,严格来说连续随机变量在任意单点处的取值概率P(X=k,Y=p)为0,你实际需要计算的是每个样本点对应的联合概率密度值,具体计算方案如下:
计算原理
你设定的(X,Y)服从参数为均值向量μ、协方差矩阵Σ的二维正态分布,对应的联合概率密度公式为:
$f(x,y) = \frac{1}{2\pi \sqrt{|\Sigma|}} \exp\left( -\frac{1}{2} \begin{bmatrix}x-\mu_1 \ y-\mu_2\end{bmatrix}^T \Sigma^{-1} \begin{bmatrix}x-\mu_1 \ y-\mu_2\end{bmatrix} \right)$
你可以手动代入每个样本计算,也可以直接调用统计库的内置PDF函数避免手动计算出错。
可运行代码(基于你的原有逻辑修正)
首先你原来的代码存在笔误:未定义的变量nBreadTypes应为2,对应二维变量维度,修正后完整代码如下:
using Distributions, LinearAlgebra # 1. 生成100组相关场景样本 nScenarios = 100 Σ = [25 0.4; 0.4 4] μ = [50, 30] L = cholesky(Σ) # 生成标准正态随机数矩阵 v = rand(Normal(0, 1), 2, nScenarios) # 通过Cholesky分解得到相关样本 samples = L.U' * v .+ μ X = samples[1, :] Y = samples[2, :] # 2. 计算每个样本对应的联合概率密度 # 构造二维正态分布对象 mvn_dist = MvNormal(μ, Σ) # 逐个样本计算PDF值 sample_pdfs = [pdf(mvn_dist, [X[i], Y[i]]) for i in 1:nScenarios]
结果说明
- 输出的
sample_pdfs数组和样本数量一一对应,第i个值就是第i组(X[i],Y[i])样本的联合概率密度 - 如果你需要将生成的场景作为离散场景做加权计算,直接将
sample_pdfs做归一化处理后即可作为各场景的离散概率使用
内容的提问来源于stack exchange,提问作者devCharaf
相关产品推荐
相关产品推荐

