using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PBS.WinFrmUI.Hydro { public class DynamicThresholdProcessor { public static List FilterWithDynamicSigma(List rawData) { return ProcessGroup(rawData); } private static List ProcessGroup(List group) { const int minSize = 3; if (group.Count < minSize) return group; var pressures = group.Select(p => p.Y).ToList(); // 计算统计量 var (mean, stdDev) = CalculateStats(pressures); double skewness = CalculateSkewness(pressures); if (group.Count > 5) { } // 动态调整σ倍数 double sigmaMultiplier = CalculateSigmaMultiplier(skewness); if (sigmaMultiplier==3) { } // 计算边界 double lower = mean - sigmaMultiplier * stdDev; double upper = mean + sigmaMultiplier * stdDev; return group.Where(p => p.Y >= lower && p.Y <= upper).ToList(); } // 核心统计计算 private static (double mean, double stdDev) CalculateStats(List values) { double mean = values.Average(); double stdDev = Math.Sqrt(values.Sum(v => Math.Pow(v - mean, 2)) / (values.Count - 1)); return (mean, stdDev); } // 偏度计算(Pearson's moment coefficient) private static double CalculateSkewness(List values) { double mean = values.Average(); double std = CalculateStats(values).stdDev; double sum = values.Sum(v => Math.Pow((v - mean) / std, 3)); return (sum * values.Count) / ((values.Count - 1) * (values.Count - 2)); } // 动态σ倍数计算规则 private static double CalculateSigmaMultiplier(double skewness) { return skewness switch { > 1.0 => 2.0, // 强正偏态 > 0.5 => 2.5, > -0.5 => 3.0, // 近似正态 > -1.0 => 3.5, _ => 4.0 // 强负偏态 }; } } }