Board logo

标题: 去除异常数据的思路 [打印本页]

作者: look_w    时间: 2019-4-17 18:56     标题: 去除异常数据的思路

在对大量数据进行分析时  如果有些数值不符合正常情况 可以用以下方法尝试 去异常值:


求出所有数值的均值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();




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0