在对大量数据进行分析时 如果有些数值不符合正常情况 可以用以下方法尝试 去异常值:
求出所有数值的均值m(注意不要去重)
m=(x1+x2+....xn)/n
求出所有数值的标准差 s
标准差计算公式 :
s=Math.Sqrt((x1-m)*(x1-m)+(x2-m)*(x2-m)+(x3-m)*(x3-m)....(xn-m)*(xn-m)/n)
最小值为 m-s
最大值 为m+s
取最小值和最大值之间的数据
如果还存在 异常数据 可以重复 上述过程
尤其是 最小值为负数的情况 证明数据波动较大 可多做几次 去异常 直到 最小值 不为负
部分代码:
List<double> price_middle = new List<double>(); List<double> price_low = new List<double>(); //求本项目的均值 double price_total = 0.0; double price_total_2 = 0.0; double price_averange = 0.0; double price_sd = 0.0; int price_count = 0; int price_count2 = 0; double price_min = 0.0; double price_max = 0.0; if (ds.Tables[0].Rows.Count > 0) { foreach (DataRow row in ds.Tables[0].Rows) { string price_string = row["price"].ToString(); double price_result = 0.0; price_total += price_result; price_count++; price_middle.Add(price_result); } } price_averange = price_total / price_count; //标准差 if (ds.Tables[0].Rows.Count > 0) { foreach (DataRow row in ds.Tables[0].Rows) { price_total_2 += (price_result - price_averange) * (price_result - price_averange); price_count2++; price_low.Add(price_result); } } price_sd = Math.Sqrt(price_total_2 / price_count2); ; price_min = price_averange - price_sd; price_max = price_averange + price_sd; System.IO.StreamWriter sw = System.IO.File.AppendText("log.txt"); sw.WriteLine("---------------------------------用来计算平均的值-----------------------------------"); for (int y = 0; y < price_middle.Count; y++) { sw.WriteLine(y.ToString() + "\t" + price_middle[y].ToString()); } sw.WriteLine("--------------------------------------------------------------------"); sw.WriteLine("---------------------------------用来计算标准差的值-----------------------------------"); for (int y = 0; y < price_low.Count; y++) { sw.WriteLine(y.ToString() + "\t" + price_low[y].ToString()); } sw.WriteLine("--------------------------------------------------------------------"); sw.WriteLine("均值" + price_averange.ToString()); sw.WriteLine("标准差" + price_sd.ToString()); sw.WriteLine("最小值" + price_min.ToString()); sw.WriteLine("最大值" + price_max.ToString()); sw.WriteLine("\n"); sw.Flush(); sw.Close();