Python statistics.kde 怎样按样本构造密度函数
来源:17golang原创
时间:2026-10-31 06:10:10 108浏览 收藏
如果手里只有一组离散测量值,想观察它大致集中在哪些位置,可以用 Python 标准库的 statistics.kde 把样本转换成一个可调用的概率密度函数。它不会直接返回一张图,而是返回类似 pdf(x) 的函数;你再给它一组横坐标,就能得到对应的密度值。
官方地址:https://docs.python.org/3/library/statistics.html
kde(data, h, kernel='normal', cumulative=False)的核心是样本、带宽h和核函数。h越小越强调局部细节,越大越平滑;cumulative=True时返回的是累计分布函数。
把样本变成可调用的密度函数
kde 的输入是一组数值样本和正向的平滑尺度 h。返回值本身是函数,所以适合与网格、表格或其他绘图工具组合。下面的例子只展示标准库的计算关系,未把图形库混进来:
from statistics import kde
# 样本应保持同一量纲;这里把它看成一组测量结果
samples = [1.2, 1.5, 1.7, 2.0, 2.1, 2.4, 2.8]
# h 控制平滑程度;返回值是可以反复调用的密度函数
pdf = kde(samples, h=0.35)
# 用等距横坐标取值,便于后续表格或绘图工具消费
x_grid = [1.0 + i * 0.2 for i in range(11)]
density = [pdf(x) for x in x_grid]
# 只输出坐标和密度,不把输出误认为原始样本频数
for x, y in zip(x_grid, density):
print(f"{x:.1f}: {y:.6f}")
这里的 density 与样本列表不是一一对应的频数表,而是估计出的连续函数在指定位置的函数值。横坐标网格越密,得到的观察点越多,但不会改变 kde 本身的估计规则。

带宽 h 决定局部细节和整体平滑
在 KDE 中,h 是最值得先调的参数。较小的 h 会让每个样本点附近的特征更突出,可能保留更多局部起伏;较大的 h 会把相邻样本的影响摊得更开,曲线更平滑,但过大时可能掩盖数据中的峰。
可以固定样本和横坐标,只比较不同带宽返回的函数:
from statistics import kde
samples = [10, 11, 11.5, 12, 18, 18.5, 19]
x = 12.0
# 同一位置比较两个带宽,观察局部细节与平滑程度的取舍
for h in (0.5, 2.0):
pdf = kde(samples, h=h, kernel="normal")
print(f"h={h}: density({x})={pdf(x):.6f}")
这个比较只能说明参数带来的形态差异,不能单凭某一个点的密度值判断模型“更准确”。实际使用时应结合样本量、测量噪声和下游任务选择 h,并保持比较时的样本与横坐标一致。
kernel 与 cumulative 参数分别改变什么
kernel 决定每个样本点对附近位置如何分配权重。官方文档列出了 normal、logistic、sigmoid 等会影响所有样本位置的核,也列出了 uniform、triangular、parabolic、quartic、triweight 和 cosine 等只在带宽范围内产生影响的核。通常先固定一个合适的 h,再有目的地比较核函数,避免同时改动两个变量。
如果需要的是“截至某个 x 的累计比例”,可把返回语义切换为 CDF:
from statistics import kde
samples = [2.0, 2.5, 3.0, 3.2, 4.1, 4.8]
# cumulative=True 返回累计分布函数,而不是密度函数
cdf = kde(samples, h=0.4, cumulative=True)
# 这些值用于回答“样本分布估计中有多少落在 x 左侧”
for x in (2.5, 3.0, 4.0):
print(f"P(X
因此,PDF 更适合观察分布形状,CDF 更适合读取某个阈值左侧的累计概率。两者都来自同一组样本和带宽,但不能把 CDF 的值当成某个点的密度。

空输入、类型和版本边界
空数据会触发 StatisticsError,所以在接收外部数据时应先决定“空批次是跳过、补采样还是报错”,不要让它在函数调用深处才暴露。statistics 文档还说明,标准库统计函数通常支持 int、float、Decimal 和 Fraction;混合类型的行为不应依赖,输入最好先统一成同一种数值类型。
kde 是 Python 3.13 加入的能力。如果部署环境低于这个版本,不能只把导入语句复制过去就期待标准库存在;应先确认运行时版本,再决定升级 Python 或使用项目允许的第三方统计方案。本文不把第三方库的接口与 statistics.kde 混用。
常见问题
h 越小是不是一定越好?
不是。小带宽能保留更多局部变化,也更容易把噪声当成结构;大带宽更平滑,也可能抹掉窄峰。应在固定数据和下游目标的前提下比较,而不是只追求曲线细节。
kde 返回的是数组吗?
不是,它返回一个可调用对象。需要数组时,先准备自己的 x_grid,再逐点调用返回函数收集结果。
什么时候用 cumulative=True?
当问题是“估计有多少样本不超过某个阈值”时使用;如果问题是观察分布峰值和形状,保留默认的 PDF 语义更合适。
小结:先把样本统一成数值序列,再用 kde 得到可调用函数;优先理解 h 对平滑程度的影响,最后根据问题选择普通密度或累计分布。
-
316 收藏
-
194 收藏
-
200 收藏
-
166 收藏
-
144 收藏
-
292 收藏
-
160 收藏
-
123 收藏
-
482 收藏
-
文章 · python教程 | 12小时前 | 标准库 · 持久化 · python · Python Cookiejar expires http.CookieJar FileCookieJar ignore_expires330 收藏
-
299 收藏
-
309 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习