Python绘制中位数10.0、离散度20%的对数正态随机变量CDF的技术求助及代码验证
求助:绘制特定参数对数正态分布的CDF
我Python编程基础比较薄弱,刚接触相关概念,现在有个作业要完成,想请大家帮忙:需要绘制一个**中位数为10.0、离散度为20%**的对数正态随机变量的CDF(累积分布函数)。我已经通过公式手动算出了这个随机变量的均值和标准差,但实在搞不清具体怎么用代码实现,恳请各位指点!
更新1
我在论坛里找到了一段代码,感觉可能有用,贴出来请大家帮忙看看这段代码能不能用?要不要做些修改?
import math from scipy import stats # standard deviation of lognormal distribution sigma = -19917.63 # mean of Lognormal distribution mu = 22135.873 # hopefully, total is the value where you need the cdf total = 37 frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu)) frozen_lognorm.cdf(total) # use whatever function and value you need here
解答
兄弟,先给你说句实在的:你找到的这段代码完全不能用,参数值明显错得离谱,得彻底调整才行。下面我一步步给你讲怎么正确实现你的需求:
第一步:先搞懂参数对应关系
对数正态分布的mu和sigma(这里是对数转换后的均值和标准差)和你给的中位数、离散度(变异系数CV)是有固定转换公式的:
- 对数正态的中位数等于
exp(mu),所以已知中位数是10.0,那mu = ln(10) ≈ 2.3026 - 离散度(20%也就是0.2)是变异系数CV,公式是
CV = sqrt(exp(sigma²) - 1),反过来算:sigma = sqrt(ln(CV² + 1)) = sqrt(ln(0.2² + 1)) ≈ 0.198
第二步:完整的绘图代码
你需要结合scipy.stats处理分布,再用matplotlib绘图,直接用下面这段代码就行:
import math import numpy as np import matplotlib.pyplot as plt from scipy import stats # 定义你的参数 median = 10.0 cv = 0.2 # 20%离散度 # 转换为对数正态分布的参数 mu = math.log(median) sigma = math.sqrt(math.log(cv**2 + 1)) # 冻结该参数的对数正态分布 lognorm_dist = stats.lognorm(s=sigma, scale=math.exp(mu)) # 生成绘图用的x值范围(覆盖98%的概率区间,避免极端值) x = np.linspace(lognorm_dist.ppf(0.01), lognorm_dist.ppf(0.99), 1000) # 计算每个x对应的CDF值 cdf_values = lognorm_dist.cdf(x) # 绘制CDF曲线 plt.figure(figsize=(8, 5)) plt.plot(x, cdf_values, label='Lognormal CDF (median=10, CV=20%)') plt.axvline(x=median, color='red', linestyle='--', label='Median (10.0)') plt.xlabel('Random Variable X') plt.ylabel('Cumulative Probability') plt.title('CDF of Lognormal Random Variable') plt.legend() plt.grid(alpha=0.3) plt.show()
为啥你找的代码不行?
sigma是负数?这完全不合理,标准差(哪怕是对数后的)不可能是负的mu和sigma的数值大到离谱,和你要的中位数10、20%离散度完全不沾边,明显是别人针对其他问题的参数,直接套用肯定错- 那段代码只算了单个点的CDF值,根本没实现你要的绘图功能
额外小技巧
如果你想计算某个特定点的CDF值(比如x=15),只需要加一行:
print(f"CDF at x=15: {lognorm_dist.cdf(15):.4f}")
就能得到精确的累积概率了。
内容的提问来源于stack exchange,提问作者suzdeex8197
相关产品推荐
相关产品推荐

