700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

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

时间:2021-04-14 05:01:43

相关推荐

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

1、问题的提出:

电池生产中,遇到一批电池的测量结果数据:

其中,有一部分电池的电压出现过低和过高的情况,并不符合正态分布。

现在需要剔除这些异常的电池数据。

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 .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σ法则仅局限于对正态或近似正态分布的样本数据处理,且适用于有较多组数据的时候。

这种判别处理原理及方法是以测量次数充分大为前提的,当测量次数的情形用准则剔除粗大误差是不够可靠的。因此,在测量次数较少的情况下,最好不要选用准则,而用其他准则。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。