javaee论坛

普通会员

225648

帖子

355

回复

369

积分

楼主
发表于 2017-08-18 09:10:13 | 查看: 98 | 回复: 2

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


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





上一篇:聚类 下一篇:java实战(六)

普通会员

0

帖子

345

回复

359

积分
沙发
发表于 2019-12-07 19:25:51

如果这就是爱,再转身的时候就该留下

普通会员

0

帖子

342

回复

348

积分
板凳
发表于 2023-09-21 07:02:21

专业抢二楼!顺便笑摸狗头(3L)

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017