C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)
原文:C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)
1、问题的提出:
电池生产中,遇到一批电池的测量结果数据:
| 电压值 | 电池个数 | 电压值 | 电池个数 | 电压值 | 电池个数 | 电压值 | 电池个数 | |||
| 0.056 | 1 | 4.09 | 1 | 4.146 | 17 | 4.174 | 13434 | |||
| 0.321 | 1 | 4.094 | 1 | 4.147 | 17 | 4.175 | 13973 | |||
| 0.767 | 1 | 4.099 | 2 | 4.148 | 19 | 4.176 | 13339 | |||
| 0.972 | 1 | 4.112 | 1 | 4.149 | 23 | 4.177 | 12275 | |||
| 3.098 | 1 | 4.119 | 3 | 4.15 | 26 | 4.178 | 10309 | |||
| 3.187 | 1 | 4.12 | 1 | 4.151 | 40 | 4.179 | 8376 | |||
| 3.319 | 1 | 4.121 | 1 | 4.152 | 50 | 4.18 | 6324 | |||
| 3.526 | 1 | 4.122 | 3 | 4.153 | 75 | 4.181 | 4667 | |||
| 3.53 | 1 | 4.125 | 3 | 4.154 | 84 | 4.182 | 3340 | |||
| 3.532 | 1 | 4.126 | 2 | 4.155 | 100 | 4.183 | 2358 | |||
| 3.54 | 1 | 4.127 | 1 | 4.156 | 118 | 4.184 | 1719 | |||
| 3.541 | 1 | 4.128 | 2 | 4.157 | 153 | 4.185 | 1199 | |||
| 3.544 | 1 | 4.129 | 3 | 4.158 | 173 | 4.186 | 839 | |||
| 3.545 | 2 | 4.13 | 2 | 4.159 | 248 | 4.187 | 622 | |||
| 3.832 | 1 | 4.132 | 2 | 4.16 | 335 | 4.188 | 417 | |||
| 3.928 | 1 | 4.133 | 2 | 4.161 | 419 | 4.189 | 304 | |||
| 3.93 | 1 | 4.134 | 4 | 4.162 | 540 | 4.19 | 170 | |||
| 3.951 | 1 | 4.135 | 1 | 4.163 | 731 | 4.191 | 124 | |||
| 3.963 | 1 | 4.136 | 5 | 4.164 | 962 | 4.192 | 77 | |||
| 3.972 | 1 | 4.137 | 4 | 4.165 | 1359 | 4.193 | 43 | |||
| 3.973 | 2 | 4.138 | 6 | 4.166 | 1846 | 4.194 | 44 | |||
| 4.045 | 1 | 4.139 | 9 | 4.167 | 2621 | 4.195 | 25 | |||
| 4.046 | 1 | 4.14 | 2 | 4.168 | 3728 | 4.196 | 20 | |||
| 4.079 | 1 | 4.141 | 6 | 4.169 | 5086 | 4.197 | 8 | |||
| 4.085 | 1 | 4.142 | 4 | 4.17 | 6822 | 4.198 | 9 | |||
| 4.087 | 1 | 4.143 | 6 | 4.171 | 8649 | 4.199 | 5 | |||
| 4.088 | 1 | 4.144 | 13 | 4.172 | 10210 | 4.2 | 3 | |||
| 4.089 | 1 | 4.145 | 14 | 4.173 | 12072 |
其中,有一部分电池的电压出现过低和过高的情况,并不符合正态分布。
现在需要剔除这些异常的电池数据。
2、方法原理:
3σ准则又称为拉依达准则,它是先假设一组检测数据只含有随机误差,对其进行计算处理得到标准偏差,按一定概率确定一个区间,认为凡超过这个区间的误差,就不属于随机误差而是粗大误差,含有该误差的数据应予以剔除。
在正态分布中σ代表标准差,μ代表均值。x=μ即为图像的对称轴
3σ原则:
数值分布在(μ-σ,μ+σ)中的概率为0.6827
数值分布在(μ-2σ,μ+2σ)中的概率为0.9544
数值分布在(μ-3σ,μ+3σ)中的概率为0.9974
可以认为,Y 的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到0.3%。
3、C#的具体实现:
//定义电压-数量关系的类
public class VoltageCount
{
public Double Voltage { get; set; }
public int CountV { get; set; }
public VoltageCount()
{
}
public VoltageCount(Double voltage, int countV)
{
this.Voltage = voltage;
this.CountV = countV;
}
}
//关键类使用拉依达准则(3σ准则)剔除数据异常
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Photo.QQAA.Net.Helper
{
/// <summary>
/// 使用拉依达准则(3σ准则)剔除数据异常
/// </summary>
public class ExceptionVoltageHelper
{
List<VoltageCount> listVoltageCount;
double average = 0.0;
int _badDataCount = -1;//奇异值个数
/// <summary>
/// 获取奇异值个数
/// </summary>
public int BadDataCount
{
get { return _badDataCount; }
}
public ExceptionVoltageHelper(List<VoltageCount> list)
{
this.listVoltageCount = list;
SetAverage();
}
/// <summary>
/// 取得平均电压值
/// </summary>
/// <returns></returns>
protected double GetAvgVoltage()
{
double avg = 0;
double total = 0;
int allCount = 0;
foreach (VoltageCount vc in listVoltageCount)
{
double v = vc.Voltage;
int c = vc.CountV;
total += v * c;
allCount += c;
}
avg = total / (allCount * 1.0);
return Math.Round(avg, 3, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 平均值
/// </summary>
/// <returns></returns>
void SetAverage()
{
this.average = GetAvgVoltage();
}
/// <summary>
/// 标准差
/// </summary>
/// <returns></returns>
double StandardDeviation()
{
List<double> listDataV = new List<double>();
foreach (VoltageCount vc in this.listVoltageCount)
{
double v = vc.Voltage;
int countV = vc.CountV;
for (int i = 0; i < countV; i++ )
{
listDataV.Add((v - this.average) * (v - this.average));
}
}
double sumDataV = listDataV.Sum();
double std = Math.Sqrt(sumDataV / (listDataV.Count - 1));
return std;
}
public List<VoltageCount> GetGoodList()
{
_badDataCount = 0;
double sd3 = StandardDeviation() * 3;//3倍标准差
List<VoltageCount> listVC = new List<VoltageCount>();
foreach (VoltageCount vc in this.listVoltageCount)
{
if (Math.Abs(vc.Voltage - this.average) <= sd3)
{
listVC.Add(vc);
}
else
{
_badDataCount += vc.CountV;
}
}
return listVC;
}
}
}
4、局限性及注意事项:
本3σ法则仅局限于对正态或近似正态分布的样本数据处理,且适用于有较多组数据的时候。
这种判别处理原理及方法是以测量次数充分大为前提的,当测量次数的情形用准则剔除粗大误差是不够可靠的。因此,在测量次数较少的情况下,最好不要选用准则,而用其他准则。
C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)的更多相关文章
- tpot从elastic search拉攻击数据之一 找本地数据端口
前面,我们已经在ubuntu服务器上部署好了tpot,并启动进行数据捕获 可以通过64297端口登陆到kibana可视化平台查看捕获到攻击的情况. 现在要拉取攻击数据了,但是该怎么拉呢? 看了一上午的 ...
- layui动态设置下拉框数据,根据后台数据设置选中
追加下拉框数据: 设置默认选中: 正常的判断这种情况是不行的,因为追加出的数据,在前台显示的并不是同一个下拉框,原来的下拉框被隐藏了 因此需要:根据原来的位置,寻找下一个节点,寻找子节点的方式找到相应 ...
- vuetify.js框架 下拉框数据改变DOM原数据未清除
今天遇到一个奇怪的bug 需求很简单,就是将“引擎能力”下拉框选中的值作为筛选条件传入到“样本类型”下拉框中,默认“样本类型”下拉框显示所有样本类型 看图: 如图所示,功能很简单. 其实还是对vuet ...
- 从数据源拉取数据,将数据内容与一组搜索项做比对 go func() chanel
https://github.com/goinaction/code [root@hadoop3 sample]# go run main.go 2018/07/30 17:45:39 Registe ...
- Reading | 《DEEP LEARNING》
目录 一.引言 1.什么是.为什么需要深度学习 2.简单的机器学习算法对数据表示的依赖 3.深度学习的历史趋势 最早的人工神经网络:旨在模拟生物学习的计算模型 神经网络第二次浪潮:联结主义connec ...
- TCP/IP详解 (转)
TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...
- TCP IP详解(转)
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...
- TCP/IP详解学习笔记 这位仁兄写得太好了
TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...
- java web面试
1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理. 原博http://blog.csdn.net/shuaishenkkk/article/d ...
随机推荐
- [Django] ModelViewSet from rest_framework and Router
To build rest api easily, we can use ModelViewSet from rest_framework. It provides GET, POST, DELETE ...
- php实现求二进制中1的个数(右移、&、int32位)(n = n & (n - 1);)
php实现求二进制中1的个数(右移.&.int32位)(n = n & (n - 1);) 一.总结 1.PHP中的位运算符和java和c++一样 2.位移运算符看箭头方向,箭头向左就 ...
- [Vue] Use Vue.js Component Computed Properties
You can add computed properties to a component to calculate a property on the fly. The benefit of th ...
- 基于 Android NDK 的学习之旅-----Android.mk 介绍
一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...
- spring+aspectJ的实现
AspectJ:(Java社区里最完整最流行的AOP框架) spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ 在Spring2.0以上版本中,可以使用基于Aspect ...
- js进阶 9-14 js如何实现下拉列表多选移除
js进阶 9-14 js如何实现下拉列表多选移除 一.总结 一句话总结: 1.js如何实现下拉列表多选移除? 把这个下拉列表中的option移除,然后加到另外一个下拉列表(文字)中去.remove方法 ...
- WPF实现控件拖动
原文:WPF实现控件拖动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/51823637 实现控件 ...
- 手动安装MySQL8.0
首先跟大家唠一唠家常,随着MySQL迅速的更新,MySQL突飞猛进已经更新到了8.0版本,那么它和我们之前用的5.X版本有什么明显的区别那? 首先给大家看下MySQL5.X自带表的查询速度 之后献上M ...
- spring boot jar 部署linux服务器
用命令启动spring boot 项目,一旦终端命令窗口关闭,项目也就关闭了,所以我们采用脚本的方式来运行jar 正常命令 java -jar xxx.jar 脚本启动,vim 创建 start.sh ...
- C#3 分部方法,简单标记一下
如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象. C#3 中出现了 “分部方法” ,工 ...