三倍标准差取离异值

#三倍标准差取离异值

在一组线性波动值内排除波动值较大的值,更加有利于对线性波动的分析,使数据更加准确,目前只了解了一个三倍标准差的方法,有关方法的讲解请自行百度,这里只放代码

在网上找到一个普通方法,进行了修改,如下:

        /// 
        /// 三倍标准差计算
        /// 
        /// 经过计算返回数组的最大最小值范围,再进行判断
        /// 传入的值
        /// 最大值
        /// 最小值
        private static float StDev(float[] arrData, ref float maxValue, ref float minValue) //计算标准偏差  
        {
            float xSum = 0F;
            float xAvg = 0F;//平均值
            float sSum = 0F;
            float tmpStDev = 0F;
            int arrNum = arrData.Length;
            for (int i = 0; i < arrNum; i++)
            {
                xSum += arrData[i];
            }
            xAvg = xSum / arrNum;
            for (int j = 0; j < arrNum; j++)
            {
                sSum += ((arrData[j] - xAvg) * (arrData[j] - xAvg));
            }
            tmpStDev = Convert.ToSingle(Math.Sqrt((sSum / (arrNum - 1))).ToString());
            maxValue = xAvg + 3 * tmpStDev;
            minValue = xAvg - 3 * tmpStDev;
            return tmpStDev;
        }

经过修改,自己写了一个泛型方法,使用键值对返回经过处理后的正确值和错误值,且返回标准差。

        /// 
        /// 三倍标准差取离异值
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        private T DecideError000<T>(Dictionary<int, object> inList, ref Dictionary<int, object> okRefList, ref Dictionary<int, object> errorRefList) where T : class
        {
            float xSum = 0F;//总和
            float xAvg = 0F;//平均值
            float sSum = 0F;
            float tmpStDev = 0F;//标准差
            int arrNum = inList.Count;
            foreach (var data in inList)
            {
                xSum += ToFloat(data.Value);
            }
            foreach (var data in inList)
            {
                sSum += (ToFloat(data.Value) - xAvg) * (ToFloat(data.Value) - xAvg);
            }
            xAvg = xSum / arrNum;
            tmpStDev = Convert.ToSingle(Math.Sqrt((sSum / (arrNum - 1))).ToString());

            var maxValue = xAvg + 3 * tmpStDev;
            var minValue = xAvg - 3 * tmpStDev;
            foreach (var data in inList)
            {
                if (ToFloat(data.Value) > maxValue || ToFloat(data.Value) < minValue)
                    errorRefList.Add(data.Key, data.Value);
                else
                    okRefList.Add(data.Key, data.Value);
            }
            return tmpStDev as T;
        }


        private static float ToFloat(object obj)
        {
            return Convert.ToSingle(obj);
        }

你可能感兴趣的:(C#学习笔记,离异值,键值对,三倍标准差法)