You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:12:30