/// <summary> /// Применение статистических алгоритмов обнаружения аномалий. /// </summary> private IEnumerable <AnomalyDetectionResult> RunAnomalyDetectionAlgorithms(IWaveletTransformationStatisticsModel testingModel, IWaveletTransformationStatisticsModel normalModel) { var anomalyDetectionAlgorithmResults = new Dictionary <string, AnomalyDetectionResult>(); foreach (var anomalyDetectionAlgorythm in AnomalyDetectionAlgorithms) { anomalyDetectionAlgorithmResults.Add(anomalyDetectionAlgorythm.Name, null); } var anomalyDetectionResults = new List <AnomalyDetectionResult>(); for (var i = 0; i < normalModel.WaveletStatistics.Count && i < testingModel.WaveletStatistics.Count; i++) { var normalStatistics = normalModel.WaveletStatistics[i]; var testingStatistics = testingModel.WaveletStatistics[i]; Parallel.ForEach(AnomalyDetectionAlgorithms, (IAnomalyDetectionAlgorithm algorythm) => { anomalyDetectionResults.Add(algorythm.CheckOnAnomaly(normalStatistics.ApproximationCoefficients, normalStatistics.DetailingCoefficients, testingStatistics.ApproximationCoefficients, testingStatistics.DetailingCoefficients, Sensitivity)); }); foreach (var result in anomalyDetectionResults) { // Записываются новые результаты и обновляются старые, если новые содержат информацию об обнаруженной аномалии if (anomalyDetectionAlgorithmResults[result.Source] == null || result.Type > anomalyDetectionAlgorithmResults[result.Source].Type) { anomalyDetectionAlgorithmResults[result.Source] = result; } } // Если аномалии не обнаружены, но вероятность их наличия очень высока, производится дальнейшее разложение с повторным применением статистических алгоритмов if (!anomalyDetectionAlgorithmResults.Values.Any(result => result.Type == AnomalyDetectionResultType.HighProbabilityOfAnomaly)) { break; } } return(anomalyDetectionAlgorithmResults.Values); }
/// <summary> /// Осуществляет применение статистических алгоритмов обнаружения аномалий к переданным данным. /// </summary> /// <param name="data">Исследумеые данные, представленные в виде числовых векторов.</param> /// <param name="normalModel">Стастистическая модель нормальных данных.</param> /// <returns>Коллекцию результатов обнаружения аномалий, по одному для каждого из выбранных алгоритмов обнаружения.</returns> public IEnumerable <AnomalyDetectionResult> CheckOnAnomaly(IList <double> data, IWaveletTransformationStatisticsModel normalModel) { var testingModel = WaveletTransformator.GenerateStatisticsModel(data, normalModel.Wavelet); return(RunAnomalyDetectionAlgorithms(testingModel, normalModel)); }