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

Matplotlib对数x轴直方图与对数变换值直方图PDF不匹配问题

核心原因:概率密度的变量变换必须做雅可比修正

你混淆了「对数尺度坐标轴」和「变量对数变换后绘图」两个完全不同的操作,直接把原变量的PDF套用到变换后的变量空间,违反了概率密度的变换规则。

两个场景的本质区别

  • 对数x轴场景(匹配正常):你始终在原随机变量$X$(服从对数正态分布)的数值空间计算和绘图,仅仅是把x轴的显示刻度做了对数拉伸,没有改变任何数值逻辑。
    代码中计算的pdf就是$X$的PDF:
    $$f_X(x) = \frac{1}{x\sigma\sqrt{2\pi}} \exp\left(-\frac{(\ln x-\mu)2}{2\sigma2}\right)$$
    调用plt.hist(..., density=True)时,直方图高度的计算规则是「箱内样本数/(总样本数*X轴线性箱宽)」,和$X$的PDF定义完全对齐,自然能和红线匹配。
  • 样本取对数后线性轴场景(不匹配):你通过$Y=\ln X$把数据变换到了新随机变量$Y$的空间,此时直方图计算的是$Y$的概率密度,但你绘制的红线仍然是原变量$X$的PDF,二者根本不是同一个函数,不可能匹配。

概率密度变换规则

概率密度不是普通的函数值,不能直接做$y=\ln x$的变量替换就用。对于单调变换$y=g(x)$,新变量的PDF满足:
$$f_Y(y) = f_X(x) \cdot \left|\frac{dx}{dy}\right|$$
这里$g(x)=\ln x$,因此$\frac{dx}{dy}=e^y=x$,代入后可得$Y=\ln X$服从参数为$\mu,\sigma$的正态分布,其PDF为:
$$f_Y(y) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(y-\mu)2}{2\sigma2}\right)$$
和你原来用的$X$的PDF相比,少了分母的$x$项,这就是不匹配的差值来源。

修正代码

把第二个绘图块替换为如下内容即可得到匹配的结果:

y = np.log(x)
# 计算Y=lnX的PDF(正态分布PDF)
pdf_y = np.exp(-(y - mu)**2 / (2 * sigma**2)) / (sigma * np.sqrt(2 * np.pi))
plt.hist(np.log(s), 100, density=True, align='mid')
plt.plot(y, pdf_y, linewidth=2, color='r')
plt.axis('tight')
plt.show()

易错点提醒

不要把两种操作混为一谈:

  • 改坐标轴为对数尺度:仅调整视觉显示效果,所有密度、分箱的计算逻辑全部基于原变量
  • 对变量做对数变换后绘线性轴:相当于切换到新的随机变量空间,密度的度量基准已经变化,必须按变量变换规则修正PDF

内容的提问来源于stack exchange,提问作者BelisariusCawl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:36:44