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

直方图叠加对数正态分布拟合偏差问题排查求助

问题排查与修正:对数正态分布拟合不匹配的问题

核心问题分析

  • 错误的拟合输入:你不该将np.log(data)传入lognorm.fit。scipy的lognorm类是直接针对原始对数正态分布数据设计的,无需提前对数据取对数。若传入对数后的数据,相当于用对数正态分布去拟合正态分布数据,结果自然与原始数据不匹配。
  • 参数对应关系错误:lognorm.fit()返回的参数顺序是(s, loc, scale):
    • s是对数正态分布的形状参数(对应对数转换后正态分布的标准差σ)
    • scale对应exp(μ)(μ是对数转换后正态分布的均值)
      你之前的代码错误丢弃了loc参数,还混淆了scale与μ的对应关系,导致PDF曲线计算完全错误。

修正后的代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm

# 原始整数数据,确保无0或负数(对数正态分布定义域为正)
data = np.array(data_list)

# 预处理:过滤非正值(若存在)
if np.any(data <= 0):
    data = data[data > 0]
    # 或用微小偏移处理:data = data + 1e-9

plt.hist(data, bins=32, density=True, alpha=0.6, color='g', label='Data')

# 直接用原始数据拟合,指定floc=0(对数正态分布通常无位置偏移)
sigma, loc, scale = lognorm.fit(data, floc=0)
# 生成拟合曲线的x轴数据
x = np.linspace(min(data), max(data), 1000)
# 计算对数正态分布的PDF
lognormal_pdf = lognorm.pdf(x, sigma, loc=loc, scale=scale)

plt.plot(x, lognormal_pdf, 'r-', lw=2, label='Lognormal Distribution')
plt.xlabel('X-axis Label')
plt.ylabel('Probability Density')
plt.legend()
plt.title('Histogram Overlay with Lognormal Distribution')
plt.grid(True)

plt.show()

额外验证建议

除了可视化,可通过Kolmogorov-Smirnov检验量化拟合效果:

from scipy.stats import kstest

stat, p_value = kstest(data, 'lognorm', args=(sigma, loc, scale))
print(f"KS统计量: {stat}, p值: {p_value}")
# p值大于0.05时,通常无法拒绝数据服从该对数正态分布的假设

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:22:13