已知均值和众数,求解对数正态分布CDF及相关问题
对数正态分布:已知均值和众数求P(X<均值)的解决方案
问题梳理
已知对数正态分布的均值为4744、众数为3777,需要计算随机变量X小于均值的概率,但当前无法通过已知量推导出标准差,且用SymPy编写的求解代码出现卡顿。
核心公式回顾
若随机变量( X \sim \text{LogN}(\mu, \sigma^2) ),则( Y = \ln X \sim N(\mu, \sigma^2) ),对应的关键公式:
- 众数:
mode(X) = e^(μ - σ²) - 均值:
E(X) = e^(μ + σ²/2)
推导步骤
设( \mu - \sigma^2 = \ln(\text{mode}) ),( \mu + \sigma^2/2 = \ln(\text{mean}) ),令( a = \mu ),( b = \sigma^2 ),得到线性方程组:
- ( a - b = \ln(3777) )
- ( a + b/2 = \ln(4744) )
用消元法求解:
- 用方程2减去方程1:( (a + b/2) - (a - b) = \ln(4744) - \ln(3777) )
- 化简得:( 3b/2 = \ln(4744/3777) ),解得( b = (2/3) \times \ln(4744/3777) )
- 将( b )代入方程1,可得( a = \ln(3777) + b )
得到( \mu )和( \sigma )后,计算( P(X < \text{mean}) )等价于( P(\ln X < \ln(\text{mean})) = \Phi\left( \frac{\ln(\text{mean}) - \mu}{\sigma} \right) ),其中( \Phi )是标准正态分布的CDF。
原代码问题分析
你编写的SymPy代码存在两处关键错误:
- 公式逻辑错误:错误构造了
mode - np.e**(mean - x)的表达式,完全偏离了对数正态分布均值和众数的关系 - 符号混用:同时使用SymPy符号变量和numpy的
np.e,导致求解逻辑混乱,进而出现卡顿
修正后的代码示例
import sympy as sp from scipy.stats import norm # 已知参数 mode = 3777 mean = 4744 # 定义符号变量 mu, sigma_sq = sp.symbols('mu sigma_sq') # 根据对数正态分布公式列方程 eq1 = sp.Eq(mu - sigma_sq, sp.ln(mode)) eq2 = sp.Eq(mu + sigma_sq / 2, sp.ln(mean)) # 解方程组 solution = sp.solve((eq1, eq2), (mu, sigma_sq)) mu_val = float(solution[mu]) sigma_val = float(sp.sqrt(solution[sigma_sq])) # 计算目标概率 ln_mean = sp.ln(mean) z_score = (ln_mean - mu_val) / sigma_val probability = norm.cdf(z_score) print(f"μ = {mu_val:.4f}, σ = {sigma_val:.4f}") print(f"P(X < {mean}) = {probability:.4f}")
结果说明
运行代码后会得到( \mu )、( \sigma )的具体数值,以及X小于均值的概率。核心思路是将对数正态分布的问题转换为正态分布的CDF计算,关键是正确推导均值和众数对应的线性方程组,而非错误构造表达式。
内容的提问来源于stack exchange,提问作者Lorenzo Damiani
相关产品推荐
相关产品推荐

