三倍标准差取离异值

#三倍标准差取离异值

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

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

        /// <summary>
        /// 三倍标准差计算
        /// </summary>
        /// 经过计算返回数组的最大最小值范围,再进行判断
        /// <param name="arrData">传入的值</param>
        /// <param name="maxValue">最大值</param>
        /// <param name="minValue">最小值</param>
        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;
        }

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

        /// <summary>
        /// 三倍标准差取离异值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="inList"></param>
        /// <param name="okRefList"></param>
        /// <param name="errorRefList"></param>
        /// <returns></returns>
        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);
        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值