1. 程式人生 > >C 使用拉依達準則(3σ準則)剔除異常資料( Net剔除一組資料中的奇異值)

C 使用拉依達準則(3σ準則)剔除異常資料( Net剔除一組資料中的奇異值)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

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σ法則僅侷限於對正態或近似正態分佈的樣本資料處理,且適用於有較多組資料的時候。
這種判別處理原理及方法是以測量次數充分大為前提的,當測量次數的情形用準則剔除粗大誤差是不夠可靠的。因此,在測量次數較少的情況下,最好不要選用準則,而用其他準則。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述