首页 > 编程语言 >C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

时间:2023-02-27 12:31:41浏览次数:34  
标签:vc C# 准则 List int double 剔除 public


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σ法则仅局限于对正态或近似正态分布的样本数据处理,且适用于有较多组数据的时候。
这种判别处理原理及方法是以测量次数充分大为前提的,当测量次数的情形用准则剔除粗大误差是不够可靠的。因此,在测量次数较少的情况下,最好不要选用准则,而用其他准则。

标签:vc,C#,准则,List,int,double,剔除,public
From: https://blog.51cto.com/u_15983015/6088285

相关文章

  • leetcode 862. 和至少为 K 的最短子数组
    一个双端单调队列:如果新加入的数比队列尾的数小,那么队列尾的数就可以丢去,这是因为如果未来的一个数能和队列尾的数满足条件,那么也一定可以和新加入的数满足条件。另外,如果......
  • CentOS 7关闭图形化界面
    CentOS7关闭图形化界面旋转的冬瓜皮于2021-12-1316:46:46发布7344收藏36分类专栏:linux文章标签:centos服务器linux版权华为云开发者联盟该内容已被华为云开发者......
  • 将后端的application/json的格式数据类型转换成前端需要的类型格式
    前提:后端返回的数据内容但是红框的数据对于前端来说是不正确的数据所以我感觉前端处理这个数据本身这个操作都很傻X但是我尝试进行转换代码如下:得到的数据:点击查......
  • 推荐 7 个学习 TypeScript 的宝库,2021 学 TS 看这篇就够了!
    前言猫哥是一个常年混迹在GitHub上的猫星人,所以发现了不少好的前端开源项目、常用技巧,在此分享给大家。公众号:前端GitHub,专注于挖掘GitHub上优秀的前端开源项目,并以......
  • css背景颜色
     background-color属性定义了元素的背景颜色.页面的背景颜色使用在body的选择器中:实例body{background-color:#b0c4de;}CSS中,颜色值通常以以下方式定义:十六......
  • css背景图像
    background-image属性描述了元素的背景图像.默认情况下,背景图像进行平铺重复显示,以覆盖整个元素实体.页面背景图片设置实例:实例body{background-image:url('paper.......
  • 必选三款scrum敏捷项目管理软件
    Leangoo领歌Leangoo是国产的一个项目管理软件,www.leangoo.com ,专门的Scrum敏捷开发工具,看板的管理方式,高度可视化。它支持敏捷开发全流程。从产品路线图-需求-迭代-缺......
  • CSS 文本格式
    文本格式Thistextisstyledwithsomeofthetextformattingproperties.Theheadingusesthetext-align,text-transform,andcolorproperties.Theparagraph......
  • TypeScript 基础语法
    TypeScript基础语法TypeScript程序由以下几个部分组成:模块函数变量语句和表达式注释第一个TypeScript程序我们可以使用以下TypeScript程序来输出"HelloW......
  • 五大常用Scrum敏捷开发管理工具软件
    Leangoo领歌Leangoo领歌,国产软件,专门的Scrum敏捷开发工具,看板的管理方式,高度可视化。它支持敏捷开发全流程。从产品路线图-需求-迭代-缺陷-测试-上线。燃尽图,工作量,迭代进......