You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中StatsModels核密度图:横轴实际测量的是什么?

核密度图横轴异常的问题解析

嘿,我一眼就看出问题大概率出在你的代码没跑完——你写的dens.f...应该是要调用dens.fit()吧?这一步可是statsmodels里核密度估计的关键步骤,漏掉它的话,后续绘图肯定会出问题!

先给你理清楚:你生成的100个观测值是标准正态分布,范围在-2.157到2.830之间,正常拟合后的核密度图横轴确实应该围绕-3到3这个区间。但你看到的0到500横轴,根本不是你的数据对应的变量值,而是matplotlib在没有有效绘图数据时默认生成的空轴范围。

为什么会这样?因为你没有调用dens.fit()来让模型计算核密度估计的结果。没拟合的话,dens对象里根本没存储对应的数据点和密度值,此时调用plot(),matplotlib只能给你一个空画布,用默认的0-500作为横轴范围充数。

给你贴一段完整的正确代码,照着跑就能得到你预期的图:

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

np.random.seed(1234567)
k = np.random.normal(0, 1, 100)
dens = sm.nonparametric.KDEUnivariate(k)
dens.fit()  # 这一步绝对不能省!
plt.figure(figsize=(8, 4))
dens.plot()
# 手动设置横轴范围,和你预期的-3到3匹配
plt.xlim(-3, 3)
plt.title('Kernel Density Estimate of Your Normal Data')
plt.xlabel('Observed Value')
plt.ylabel('Density')
plt.show()

补充说下:当你调用dens.fit()后,dens.support会存储核密度估计对应的横轴点(默认会稍微扩展数据的范围),dens.density是对应的密度值,此时绘图就会基于这些真实数据来生成横轴了。如果之后你还是遇到横轴范围不对的情况,检查下是不是手动设置了plt.xlim(0, 500)这类代码,不小心覆盖了默认的轴范围。

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

火山引擎 最新活动