首页 > 编程知识 正文

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

时间:2023-05-03 14:08:50 阅读:178233 作者:381

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。