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