新闻中心
深入理解 SciPy trim_mean 的截断机制与应用

本文旨在深入解析 SciPy 库中 `scipy.stats.trim_mean` 函数的工作原理,特别是其 `proportiontocut` 参数如何影响截断行为。我们将澄清 `trim_mean` 是基于样本观测值的比例进行截断,而非基于统计百分位数,并通过代码示例演示其在不同截断比例下的具体表现,并对比手动实现百分位数截断的方法,帮助读者避免常见误解。
截断均值概述
截断均值(Trimmed Mean),又称修剪均值或切尾均值,是一种统计量,旨在通过移除数据集两端的极端值来提高均值的稳健性。它通常用于处理含有异常值的数据集,以获得一个更能代表数据中心趋势的估计。在统计学中,截断均值通常定义为在排序后的数据集中,移除一定比例(或固定数量)的最小和最大值后,对剩余数据计算的均值。
SciPy trim_mean 的工作原理
scipy.stats.trim_mean 函数是 SciPy 库提供的一个实现截断均值的工具。其核心参数 proportiontocut 定义了从数据两端各截去的观测值比例。然而,一个常见的误解是,这个比例是基于数据的统计百分位数来截断的。实际上,trim_mean 的截断机制是基于样本观测值的数量。
具体来说,proportiontocut 表示从排序后的数据集的两端各移除的观测值占总观测值数量的比例。函数会计算需要移除的观测值数量:num_to_cut = proportiontocut * len(data)。关键在于,如果这个计算结果不是整数,scipy.stats.trim_mean 会向下取整,这意味着它会截去小于或等于计算结果的整数个观测值。文档中明确指出:“如果比例导致非整数切片索引,则切片的数量会减少。”
让我们通过一个具体的例子来理解这一点。
示例 1:非整数截断比例的边缘效应
考虑一个包含 9 个数据点的数据集 data = [1, 2, 2, 3, 4, 30, 4, 4, 5],并尝试使用 trim_percentage = 0.05 (即 5%) 进行截断。
from scipy.stats import trim_mean
import numpy as np
data = [1, 2, 2, 3, 4, 30, 4, 4, 5]
# 对数据进行排序,尽管trim_mean内部会处理,但为了理解清晰,手动排序
sorted_data = sorted(data)
print(f"原始排序数据: {sorted_data}")
trim_percentage = 0.05 # 从两端各截去 5%
result = trim_mean(data, trim_percentage)
print(f"使用 trim_mean({trim_percentage}) 的结果 = {result}")
# 计算应截去的观测值数量
num_observations = len(data)
num_to_cut_per_side = trim_percentage * num_observations
print(f"每端应截去的观测值数量 (理论值): {num_to_cut_per_side}")
# 实际截去的观测值数量(向下取整)
actual_cut_per_side = int(num_to_cut_per_side)
print(f"每端实际截去的观测值数量 (向下取整): {actual_cut_per_side}")
# 如果实际截去数量为0,则结果应与原始均值相同
mean_original = np.mean(data)
print(f"原始数据均值: {mean_original}")输出结果:
WOBIZ电子商务2.0程序
WO@BIZ电子商务2.0软件是窝窝团队基于对互联网发展和业务深入研究后,采用互联网2.0的思想设计、开发的电子商务和社会化网络(SNS)结合的解决方案产品。WOBIZ是互联网2.0创业、传统网站转型、中小企业宣传产品网应用的最佳选择。 它精心设计的架构、强大的功能机制、友好的用户体验和灵活的管理系统,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、 易用而快捷的电子商务2.0网络
0
查看详情
原始排序数据: [1, 2, 2, 3, 4, 4, 4, 5, 30] 使用 trim_mean(0.05) 的结果 = 6.111111111111111 每端应截去的观测值数量 (理论值): 0.45 每端实际截去的观测值数量 (向下取整): 0 原始数据均值: 6.111111111111111
从上述结果可以看出,当 trim_percentage 为 0.05 时,对于 9 个数据点,每端应截去的观测值数量为 0.05 * 9 = 0.45。由于 trim_mean 会向下取整,实际每端截去的观测值数量为 0。因此,函数返回的结果就是原始数据集的均值,没有任何观测值被移除。
示例 2:当截断比例刚好超过阈值时
为了验证上述行为,我们可以调整 proportiontocut,使其刚好超过能截去至少一个观测值的阈值。
对于 9 个数据点,要截去每端一个观测值,proportiontocut 必须大于 1/9。
from scipy import stats
import numpy as np
x = [1, 2, 2, 3, 4, 30, 4, 4, 5]
sorted_x = sorted(x)
print(f"原始排序数据: {sorted_x}")
p_threshold = 1 / len(x) # 截去一个观测值所需的最小比例
print(f"截去一个观测值所需的比例阈值: {p_threshold:.4f}")
eps = 1e-15 # 一个非常小的正数
# 比例略小于阈值时
result_below_threshold = stats.trim_mean(x, p_threshold - eps)
print(f"当 proportiontocut = {p_threshold - eps:.4f} 时 (略小于阈值): {result_below_threshold}")
# 比例略大于阈值时
result_above_threshold = stats.trim_mean(x, p_threshold + eps)
print(f"当 proportiontocut = {p_threshold + eps:.4f} 时 (略大于阈值): {result_above_threshold}")
# 手动计算截去一个观测值后的均值
# 截去最小的 1 和最大的 30
trimmed_manually = sorted_x[1:-1] # 移除第一个和最后一个元素
print(f"手动截去一个观测值后的数据: {trimmed_manually}")
print(f"手动截去一个观测值后的均值: {np.mean(trimmed_manually)}")输出结果:
原始排序数据: [1, 2, 2, 3, 4, 4, 4, 5, 30] 截去一个观测值所需的比例阈值: 0.1111 当 proportiontocut = 0.1111 时 (略小于阈值): 6.111111111111111 当 proportiontocut = 0.1111 时 (略大于阈值): 3.4285714285714284 手动截去一个观测值后的数据: [2, 2, 3, 4, 4, 4, 5] 手动截去一个观测值后的均值: 3.4285714285714284
这个例子清晰地表明,一旦 proportiontocut 超过了 1/len(data),trim_mean 就会从两端各截去一个观测值。截去 1 和 30 后,剩余数据为 [2, 2, 3, 4, 4, 4, 5],其均值为 3.428571...,这与 trim_mean 在 p_threshold + eps 时的结果一致。
与百分位数截断的对比
用户最初的困惑在于,他们预期 trim_mean 会像基于百分位数那样进行截断,即移除低于第 5 百分位数和高于第 95 百分位数的数据。这种方法与 trim_mean 的基于观测值数量的截断是不同的概念。
百分位数截断的实现
如果需要基于百分位数来截断数据,则需要手动实现。以下是一个使用 NumPy 实现百分位数截断的示例:
import numpy as np
data = [1, 2, 2, 3, 4, 30, 4, 4, 5]
percentile_lower = 5 # 5th percentile
percentile_upper = 95 # 95th percentile
# 计算第 5 和第 95 百分位数
p5, p95 = np.percentile(data, [percentile_lower, percentile_upper])
print(f"第 {percentile_lower} 百分位数 = {p5}")
print(f"第 {percentile_upper} 百分位数 = {p95}")
# 过滤掉落在百分位数之外的数据
trimmed_by_percentile = [x for x in data if p5 < x < p95]
print(f"按百分位数截断后的数据: {trimmed_by_percentile}")
# 计算截断后的均值
if trimmed_by_percentile:
mean_by_percentile = np.mean(trimmed_by_percentile)
print(f"按百分位数截断后的均值 = {mean_by_percentile}")
else:
print("按百分位数截断后没有剩余数据。")输出结果:
第 5 百分位数 = 1.4 第 95 百分位数 = 19.999999999999993 按百分位数截断后的数据: [2, 2, 3, 4, 4, 5] 按百分位数截断后的均值 = 3.3333333333333335
在这个例子中,第 5 百分位数是 1.4,第 95 百分位数是 19.99...。因此,原始数据中的 1 和 30 都被移除了(因为 1 小于 1.4,30 大于 19.99...)。最终计算出的均值是 3.333...。这与 scipy.stats.trim_mean 的结果明显不同,因为它们采用了不同的截断策略。
总结与建议
-
scipy.stats.trim_mean 基于观测值数量截断:
- proportiontocut 参数指定的是从数据两端各移除的观测值数量占总观测值数量的比例。
- 如果计算出的应移除观测值数量不是整数,函数会向下取整,这意味着可能实际移除的观测值数量少于预期,甚至为零。
- 当数据集较小,且 proportiontocut 较小时,很可能不会移除任何观测值。
-
百分位数截断是不同的概念:
- 如果需要根据数据的统计百分位数(例如,移除低于第 5 百分位数或高于第 95 百分位数的数据)来截断,scipy.stats.trim_mean 不适用。
- 在这种情况下,需要手动使用 numpy.percentile 等函数计算百分位数,然后根据这些阈值过滤数据。
-
选择合适的截断方法:
- 当您希望移除固定比例的极端观测值(例如,总是移除最小的 10% 和最大的 10% 的数据点,无论它们的值是多少)时,scipy.stats.trim_mean 是一个合适的选择。
- 当您希望移除落在特定统计范围之外(例如,低于某个百分位数或高于另一个百分位数)的观测值时,应采用基于百分位数的手动过滤方法。
理解 scipy.stats.trim_mean 的精确行为对于正确应用截断均值至关重要,尤其是在处理小数据集或需要精细控制截断逻辑的场景中。
以上就是深入理解 SciPy trim_mean 的截断机制与应用的详细内容,更多请关注其它相关文章!
# 这与
# 如何强化网站建设
# 南充营销企业网站优化
# 辽宁好的英文网站推广商
# 网站建站推广语
# 廊坊网站建设思创
# 品牌整合营销推广计划
# 淘客怎么弄网站推广页面
# 龙岗区网站推广定制
# 高端模板网站建设价格
# 营销推广秒赞怎么删除
# 工具
# 落在
# 量为
# 原始数据
# 是一个
# 所需
# 互联网
# 移除
# 均值
# 截去
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Tabulator表格日期时间排序问题及自定义解决方案
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
韩剧圈正版入口页面_韩剧圈官网登录链接
UC浏览器官网入口2025最新 UC浏览器网页版正式地址
React Hooks最佳实践:动态组件状态管理的组件化方案
使用Pandas转换并合并DataFrame:多列映射至统一结构
痛风发作了怎么办? 快速止痛和后期饮食调理
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
AO3最新官网入口公告_2025AO3镜像站实时查询方法
构建轻量级网站内部消息系统:Formspree 集成指南
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
J*a中实现Go语言select通道多路复用机制
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
谷歌推RCS信息存档功能:公司可监控员工私密信息!
Python自定义类排序:解决lambda键值访问TypeError的实践指南
Promise错误处理:在catch后终止链式then执行的策略
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
微信商城在哪里打开【步骤】
必由学官方登录入口 必由学教师学生账号快速访问
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
抖音从哪里进入网页版_抖音官方入口链接
J*aScript中在Map循环中检测并处理空数组元素
AO3中文官网链接_AO3网页版稳定镜像站
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
HTML空白字符处理机制:渲染、DOM与编码实践
快速CSGO开箱网站指南 CSGO开箱平台推荐
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
AO3官方在线访问地址 Archive of Our Own最新镜像合集
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
qq音乐在线播放入口_qq音乐电脑版登录链接
韩小圈电脑版在线入口_网页版免费登录地址
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
poki免费入口快捷访问 poki人气小游戏直接玩站点
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
c++如何使用chrono库处理时间_c++标准库时间与日期操作
服务端验证_j*ascript输入检查
微信群消息显示延迟如何解决 微信群消息刷新优化方法
EMS快递官网app_中国邮政速递物流手机客户端
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
PHP URL参数传递与500错误调试指南
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情


2025-11-18
浏览次数:次
返回列表