1、问题的提出:
在电池生产中,遇到了大量的电池测量结果数据:
http://www.Sina.com/http://www.Sina.com /
http://www.Sina.com/http://www.Sina.com /
http://www.Sina.com/http://www.Sina.com /
http://www.Sina.com/http://www.Sina.com/0.05614.0914.146174.174134340.32114.09414.147174.175139730.76714.09924.17613390.97214.111112121111114 52614.153754.18146673.5314.12534.154844.1844.12824.1571534.18511993.54414.12934.15848884 25404.191703.95114.13514.1637314.1911243.96314.13654.1649624.192773.97214.1651359944.195254.195254
其中有些电池电压过低或过高,不符合正态分布。
现在有必要消除这些异常的电池数据。
电压值
3标准又称依达拉奉标准,首先假设一组检测数据只包含随机误差,对其进行计算处理得到标准差,按一定概率确定一个区间,超过该区间误差,认为不是随机误差,而是粗大误差,包含该误差的数据应该排除
在正态分布中,表示标准偏差,表示平均值。 x=是图像的对称轴
电池个数
数值分布为(-, )的概率为0.6827
数值分布为(-2、 2)概率为0.9544
数值分布为(-3、 3)概率为0.9974
y的可取值大部分集中在(-3, 3) )区间,超出该范围的可能性被认为小于0.3%。
电压值
//电压-定义数量关系的类
公共类卷计数
{
公共双卷{ get; set; }
公共计数{ get }; set; }
公共卷计数(
{
}
publicvoltagecount (double voltage,int countV ) )。
{
this.Voltage=voltage;
this.CountV=countV;
}
}
//键类使用依达拉奉准则(3准则)消除数据异常
使用系统;
using System.Collections;
using system.collections.generic;
using System.Linq;
using System.Text;
namespace Photo.QQAA.Net.Helper
{
///summary
//使用依达拉奉指南(3指南)消除数据异常
////summary
br> 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σ法则仅局限于对正态或近似正态分布的样本数据处理,且适用于有较多组数据的时候。
这种判别处理原理及方法是以测量次数充分大为前提的,当测量次数的情形用准则剔除粗大误差是不够可靠的。因此,在测量次数较少的情况下,最好不要选用准则,而用其他准则。