- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
从直方图到核密度估计
在探索新数据集时,我们的首要任务之一是了解数据的分布方式。虽然直方图长期以来一直是实现此目的的首选工具,但它们具有局限性,有时会掩盖数据中的重要模式。让我们探索从传统直方图分箱到更复杂的核密度估计(KDE)方法的转变,并使用Python来说明关键概念。
分箱的故事:理解直方图
想象一下您正在将硬币分类到不同的盒子中。每个盒子代表一个值范围(一个箱子),您可以计算每个盒子中有多少硬币。这本质上就是直方图的作用-它将数据划分为箱并计算每个箱中观察的频率。
Bin宽度困境
创建直方图时最棘手的决定之一是选择箱数。让我们用一些示例数据来可视化这一点。我们将创建一个组合两个正态分布的数据集,并查看不同的bin计数如何影响我们的解释:
将numpy导入为np
将matplotlib.pyplot导入为plt
#从两个正态分布的混合生成样本数据
np.随机.种子(42)
数据=np.concatenate([
np.random.normal(0,1,500),#第一个正态分布
np.random.normal(4,1.5,500)#第二次正态分布
])
defCompare_bin_widths():
演示不同bin宽度对直方图的影响
图,轴=plt.subplots(1,3,Figsize=(15,4))
bins_选项=[5,20,50]
对于axe,zip中的bins(axes,bins_options):
ax.hist(数据,bins=bins,密度=True,alpha=0.7)
ax.set_title(f带{bins}bins的直方图,fontsize=18)
ax.set_xlabel(值)
ax.set_ylabel(密度)
plt.tight_layout()
返回无花果
当你运行这个函数时,你应该得到下面的视觉效果。?
并排查看这三个直方图可以揭示箱选择的影响:
通过5个bin,我们得到了一个非常粗略的视图,表明了两个主要数据区域,但丢失了所有细微特征
通过20个分箱,我们开始更清楚地看到分布的双峰性质,峰值在0和4附近
有了50个分箱,虽然我们获得了更精细的细节,但绘图变得锯齿状并且可能有噪音,从而使我们更难看到潜在的模式
这证明了直方图的核心挑战:我们需要在平滑噪声和保留重要特征之间取得平衡。
平滑替代方案:核密度估计
如果我们可以创建一条代表分布的平滑曲线,而不将数据强制放入离散箱中,会怎样?这就是核密度估计(KDE)的用武之地。这个概念非常直观:在每个数据点,KDE放置一条小钟形曲线(高斯分布),然后组合这些曲线以创建整体分布的平滑表示。
了解KDE背后的魔力
该过程分为三个简单步骤:
将高斯曲线以每个数据点为中心放置
将所有这些曲线加在一起
对结果进行归一化以创建适当的概率密度估计
此方法的关键是“带宽”参数-将其视为KDE版本的直方图bin宽度。该参数控制每条高斯曲线的展开程度,直接影响我们最终估计的平滑度。
让我们使用Python将其可视化。虽然有更简单的方法来创建KDE绘图(例如,使用seaborn的sns.kdeplot()),但我们将使用matplotlib和scipy作为示例。为什么?这种方法让我们更清楚地了解“幕后”发生的情况,并提供对带宽等重要参数的直接控制。这就像在切换到自动挡之前学习驾驶手动挡汽车一样-它可以帮助您了解实际情况。
导入scipy.stats作为统计数据
defhistogram_with_kde():
将直方图与KDE覆盖进行比较
图=plt.figure(figsize=(10,6))
#绘制直方图
plt.hist(数据,bins=30,密度=True,alpha=0.5,标签=直方图)
#计算并绘制KDE
kde=stats.gaussian_kde(数据)
x_range=np.linspace(最小值(数据),最大值(数据),200)
plt.plot(x_range,kde(x_range),r-,label=KDE)
plt.title(带KDE覆盖的直方图)
plt.xlabel(值)
plt.ylabel(密度)
plt.图例()
返回无花果
运
文档评论(0)