当前位置: 首页 > backend >正文

【C++】使用箱线图算法剔除数据样本中的异常值

目录

一、箱线图算法介绍

二、五数概括计算解释

三、四分位距(IQR)与异常值判定

四、箱线图在数据处理中的应用

1. 异常值检测

2. 数据分布比较

3. 偏态与离散程度分析

4. 非参数数据展示

五、箱线图的局限性

六、代码实现及注释

七、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


一、箱线图算法介绍

        箱线图(Boxplot)是一种基于统计学的数据可视化和数据处理工具,箱线图假设数据样本服从正态分布,通过五数概括(最小值、第一四分位数Q1、中位数Q2、第三四分位数Q3、最大值)可以进行数据统计分布和异常值检测规则。

二、五数概括计算解释

  • 最小值(Min):数据集中的最小值。
  • 第一四分位数(Q1):数据排序后第25%位置的值,即25%的数据小于等于Q1。
  • 中位数(Q2):数据排序后第50%位置的值,即50%的数据小于等于Q2。
  • 第三四分位数(Q3):数据排序后第75%位置的值,即75%的数据小于等于Q3。
  • 最大值(Max):数据集中的最大值。

三、四分位距(IQR)与异常值判定

  • IQR = Q3 - Q1:表示中间50%数据的分布范围。
  • 异常值判定规则
    • 温和异常值(Mild Outliers):位于 Q1 - 1.5×IQR 和 Q3 + 1.5×IQR 之外的数据点。
    • 极端异常值(Extreme Outliers):位于 Q1 - 3×IQR 和 Q3 + 3×IQR 之外的数据点。

四、箱线图在数据处理中的应用

1. 异常值检测

  • 优势:假设数据服从正态分布,直接通过四分位数和IQR识别异常值。
  • 场景
    • 数据清洗:剔除或修正异常值(如传感器故障导致的极端值)。
    • 质量控制:监测生产流程中的异常波动(如某批次产品的重量异常)。

2. 数据分布比较

  • 多组对比:通过并列箱线图比较不同类别或时间段的数据分布。
  • 场景
    • 学生成绩分析:比较不同班级或学科的分数分布(如数学成绩分布分散,语文成绩集中)。
    • 薪资差异分析:对比不同地区或部门的员工薪酬水平(如北京地区中位数高于西安)。

3. 偏态与离散程度分析

  • 偏态判断
    • 若中位数接近Q1,数据右偏(长尾在右侧)。
    • 若中位数接近Q3,数据左偏(长尾在左侧)。
  • 离散程度判断
    • IQR较小:数据集中(如标准化考试成绩)。
    • IQR较大:数据分散(如用户购买金额差异大)。
  • 场景:分析用户行为数据时,若某功能的使用时长分布右偏,可能表明部分用户过度依赖该功能。

4. 非参数数据展示

  • 适用场景:无需假设数据分布形态,适用于非正态分布数据。
  • 优势:相比直方图或密度图,箱线图更简洁,适合多组数据对比。

案例:医学研究中,比较不同药物治疗组的疗效数据(非正态分布),箱线图能直观显示组间差异。

五、箱线图的局限性

        1、无法显示具体分布形态:如双峰分布或复杂分布模式无法用箱线图表示。

        2、只能处理符合正态分布的样本数据。

        3、小样本敏感性:样本量过小时,四分位数和异常值判定可能不稳定。

       4、依赖经验阈值:1.5×IQR和3×IQR的异常值判定规则是经验性标准,需结合业务背景调整。

六、代码实现及注释

#include <iostream>
using namespace std;typedef short int16_t;		//int16_t为嵌入式环境下变量定义关键字
typedef bool  bool_t;		void Quick_Sort(float q[], int16_t l, int16_t r, bool_t order);					//快速排序函数前置声明void Box_Plot(float data[], int count, float &value_Min, float &value_Max);		//箱线图算法前置声明int main() {float a[] = {0.1, 0.5, 0.8, 0.86, 0.88, 0.89, 0.90};		//模拟数组样本float value_Min; 				//定义箱线图算法的异常数值下阈值float value_Max;				//定义箱线图算法的异常数值上阈值Box_Plot(a, 7, value_Min, value_Max);		//调用箱线图算法,计算数据样本中的上下异常阈值//计算 value_Min 和 value_Max 之后,可以在后续设计中进行数据滤波cout<<value_Min <<endl <<value_Max <<endl;
}/*****************************************************************************
[函数名称]Box_Plot
[函数功能]箱线图算法
[参    数]data:数据样本数组;count:数组大小;value_Min:箱线图下异常阈值;value_Max:箱线图上异常阈值
[备    注]
*****************************************************************************/
void Box_Plot(float data[], int count, float &value_Min, float &value_Max)
{float f32Count = count;			int index_Q1 = (int)(f32Count/4 + 0.5);			//计算第一四分位数int index_Q3 = (int)(f32Count/4*3 + 0.5);		//计算第三四分位数float IQR = data[index_Q3] - data[index_Q1];	//计算箱线图IRQvalue_Min = data[index_Q1] - 1.5*IQR;			//计算样本下异常阈值value_Max = data[index_Q3] + 1.5*IQR;			//计算样本上异常阈值
}/*****************************************************************************
[函数名称]Quick_Sort
[函数功能]快速排序算法
[参    数]data:待排序数组;left:数组左侧起始下标;right:数组右侧结束下标;order:排序方向
[备    注]
*****************************************************************************/
void Quick_Sort(float data[], int16_t left, int16_t right, bool_t order)
{if (left >= right)	//递归结束条件return;int16_t i = left , j = right;float x = data[(i+j)>>1];while (i < j) {if (order == 1) {while (data[i] <= x) i++;  //正序:由小到大while (data[j] > x) j--;} else {while (data[i] >= x) i++;  //逆序:由大到小while (data[j] < x) j--;}if (i < j) {					//交换数据位置float swap = data[i];data[i] = data[j];data[j] = swap;}}//递归调用Quick_Sort(data, left, j-1, order), Quick_Sort(data, j + 1, right, order);
}

七、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

http://www.xdnf.cn/news/16158.html

相关文章:

  • Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示
  • CIRL:因果启发的表征学习框架——从域泛化到奖励分解的因果革命
  • Spring MVC中常用注解_笔记
  • 【Linux】linux基础开发工具(一) 软件包管理器yum、编辑器vim使用与相关命令
  • MCU(微控制器)中的高电平与低电平?
  • 实战演练11:生成式对话机器人(Bloom)
  • 输电线路微气象在线监测装置:保障电网安全的科技屏障
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • 多模态LLM/Diffusion推理加速
  • 11.2 yolov8用自己的数据集训练语义分割模型
  • Android Camera createCaptureSession
  • Mysql命令show processlist
  • 成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能
  • 聚观早报 | 猿编程推动中美青少年AI实践;华为Pura 80数字版售价公布;iPhone 17 Air电池曝光
  • J2EE模式---组合实体模式
  • ollama无法拉取模型导致报错
  • Linux724 逻辑卷挂载;挂载点扩容;逻辑卷开机自启
  • 噪声环境下的数据驱动预测控制:提升抗测量噪声干扰能力
  • Python桌面版数独(五版)-优化选择模式触发新棋盘生成
  • Opencv C# 重叠 粘连 Overlap 轮廓分割 (不知道不知道)
  • STM32 HAL库 HAL_TIM_OC_Stop函数详细解释
  • Flink-1.19.0源码详解7-Flink集群端调度
  • RWA与DeFi(去中心化金融)的关系是什么?RWA在DeFi中扮演什么角色?
  • 使用ffmpeg转码h265后mac默认播放器不支持问题
  • 亚马逊云科技实战架构:构建可扩展、高效率、无服务器应用
  • 【25-cv-08165】纸牌游戏 UNO注册商标!!由GBC律所代理发案
  • b-up:Enzo_mi:Transformer DETR系列
  • Java 实现 C/S 架构详解:从基础到实战,彻底掌握客户端/服务端编程
  • 项目质量如何提升?
  • C++常见面试题/笔试收录(一)