标题:
去除异常数据的思路
[打印本页]
作者:
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