using System; using System.Linq; namespace IStation.WinFrmUI { public class FilterOutliersHelper { /// /// 根据 标准差 过滤 /// /// 一、标准差的计算方法 /// 1、总体标准差的计算方法:首先计算每个数据与平均值的差值,然后将差值平方,再求平均值,最后取平方根。 /// 2、样本标准差的计算方法:与总体标准差类似,但在计算差值平方的平均值时,除以样本容量减1。 /// 二、标准差的应用 /// 1、数据分布的解释:标准差可以帮助我们了解数据的离散程度。标准差越大,数据越分散;标准差越小,数据越集中。 /// 2、异常值的检测:通过计算标准差,我们可以判断是否存在异常值。如果某个数据与平均值的差距超过2个标准差,可以认为该数据是异常值。 /// 3、风险评估:在金融领域,标准差常用于衡量投资组合的风险。标准差越大,投资组合的风险越高。 /// 三、如何减小标准差 /// 1、增加样本容量:样本容量越大,标准差越小,因为更多的数据可以更好地反映总体的特征。 /// 2、优化数据收集方法:确保数据的采集过程准确无误,避免数据的偏差和误差。 /// 结论:标准差是一种重要的统计量,可以帮助我们理解数据的离散程度和风险。通过计算标准差,我们可以对数据进行解释、分析和评估。在实际应用中,我们可以通过增加样本容量和优化数据收集方法来减小标准差,提高数据的可靠性和准确性。 /// /// /// 使用总体标准差 /// public static double[] FilterBySTDEV(double[] arr, bool use_STDP) { if (arr == null || arr.Length < 2) { return arr; } double std_dev = 0, STDP = 0; var arr_count = arr.Length; var arr_avg = arr.Average(); STDEV(arr, out std_dev, out STDP); var arr_filter_std_dev = arr.Where(x => !(Math.Abs(x - arr_avg) > Math.Abs(std_dev * 2))).ToArray(); if (arr_filter_std_dev != null && arr_filter_std_dev.Length != arr_count) { STDEV(arr_filter_std_dev, out std_dev, out STDP); } var arr_filter_STDP = arr.Where(x => !(Math.Abs(x - arr_avg) > Math.Abs(STDP * 2))).ToArray(); if (arr_filter_STDP != null && arr_filter_STDP.Length != arr_count) { STDEV(arr_filter_STDP, out std_dev, out STDP); } if (use_STDP) { return arr_filter_STDP; } return arr_filter_std_dev; } /// /// 样本标准差和总体标准差计算 /// /// 数据数组 /// 样本标准差 /// 总体标准差 public static void STDEV(double[] arrData, out double std_dev, out double STDP) //计算标准偏差 { double xSum = 0F;//样本总和 double xAvg = 0F;//样本平均值 double 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)); } std_dev = Convert.ToSingle(Math.Sqrt((sSum / (arrNum - 1))).ToString());//样本标准差 STDP = Convert.ToSingle(Math.Sqrt((sSum / arrNum)).ToString());//总体标准差 } } }