基于5%与95%分位数的对数正态分布极端分位数求解及Scipy实现
对数正态分布分位数求解与Scipy实现
首先直接回应你的问题:
- 0%分位数:对数正态分布的随机变量取值范围是严格大于0的,所以理论上0%分位数是0,但这个值永远不会被实际观测到——因为对数正态变量不可能等于0,只会无限趋近于0。
- 99.999%分位数:完全可以通过已知的5%和95%分位数拟合出对数正态分布的参数,再计算这个极端分位数,下面会一步步讲清楚实现方法。
1. 拟合对数正态分布的核心原理
对数正态分布的本质是:如果随机变量 ( X \sim \text{LogNormal}(\mu, \sigma^2) ),那么取对数后的 ( Y = \ln(X) ) 服从正态分布 ( \text{Normal}(\mu, \sigma^2) )。我们可以利用这个转换,把已知分位数映射到正态分布空间求解参数:
- 已知 ( X ) 的5%分位数是10,即 ( P(X \leq 10) = 0.05 ),转换为对数空间就是 ( P(Y \leq \ln(10)) = 0.05 )
- 已知 ( X ) 的95%分位数是100,即 ( P(X \leq 100) = 0.95 ),转换为对数空间就是 ( P(Y \leq \ln(100)) = 0.95 )
结合正态分布的分位数公式,我们可以联立方程解出 ( \mu ) 和 ( \sigma ):
( \ln(10) = \mu + \sigma \cdot z_{0.05} )
( \ln(100) = \mu + \sigma \cdot z_{0.95} )
其中 ( z_{\alpha} ) 是标准正态分布的 ( \alpha ) 分位数,利用正态分布的对称性 ( z_{0.05} = -z_{0.95} ),可以简化计算得到 ( \mu ) 和 ( \sigma )。
2. Scipy代码实现步骤
步骤1:拟合对数正态分布参数
这里提供两种方法,原理一致,你可以根据习惯选择:
方法一:手动计算参数(更直观)
import numpy as np from scipy.stats import norm # 已知分位数数据 q5 = 10 q95 = 100 # 转换到对数空间 y5 = np.log(q5) y95 = np.log(q95) # 获取标准正态分布的分位数 z05 = norm.ppf(0.05) z95 = norm.ppf(0.95) # 计算正态分布的均值μ和标准差σ sigma = (y95 - y5) / (z95 - z05) mu = (y5 + y95) / 2 print(f"拟合得到的μ: {mu:.4f}, σ: {sigma:.4f}")
方法二:用Scipy内置拟合函数(更便捷)
注意Scipy的lognorm类参数定义:形状参数是 ( \sigma ),位置参数loc固定为0(因为对数正态分布从0开始),尺度参数是 ( \exp(\mu) )。
from scipy.stats import lognorm # 分位数点和对应的概率 quantiles = [q5, q95] probabilities = [0.05, 0.95] # 拟合分布,固定loc=0(符合对数正态分布的定义) sigma_fit, loc_fit, scale_fit = lognorm.fit(quantiles, floc=0) mu_fit = np.log(scale_fit) print(f"拟合得到的μ: {mu_fit:.4f}, σ: {sigma_fit:.4f}")
两种方法得到的参数几乎完全一致,因为底层逻辑相同。
步骤2:求解极端分位数(如99.999%分位数)
有了拟合好的参数,直接用分位数函数(ppf,Percent Point Function)计算即可:
# 用拟合得到的参数计算99.999%分位数 extreme_q = lognorm.ppf(0.99999, s=sigma_fit, loc=loc_fit, scale=scale_fit) print(f"99.999%分位数: {extreme_q:.2f}")
如果你想用手动计算的参数验证,也可以转换回正态空间计算:
z_extreme = norm.ppf(0.99999) y_extreme = mu + sigma * z_extreme x_extreme = np.exp(y_extreme) print(f"99.999%分位数(手动验证): {x_extreme:.2f}")
补充说明
- 关于0%分位数:对数正态分布的累积分布函数在x=0处的极限是0,但实际中X永远不会等于0,所以这个分位数只是理论上的下限。
- 极端分位数的可靠性:结果完全依赖于“X服从对数正态分布”这个假设,如果实际数据的尾部特性和对数正态分布不符,计算结果会有偏差,但在给定假设下,这个方法是严谨有效的。
内容的提问来源于stack exchange,提问作者Nex
相关产品推荐
相关产品推荐

