#三倍标准差取离异值
在一组线性波动值内排除波动值较大的值,更加有利于对线性波动的分析,使数据更加准确,目前只了解了一个三倍标准差的方法,有关方法的讲解请自行百度,这里只放代码
在网上找到一个普通方法,进行了修改,如下:
/// <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); }