Esempio n. 1
0
        public void SpikeDetection()
        {
            var       env  = new MLContext();
            const int Size = 10;
            const int PvalHistoryLength = Size / 4;

            // Generate sample series data with a spike
            List <Data> data     = new List <Data>(Size);
            var         dataView = env.Data.LoadFromEnumerable(data);

            for (int i = 0; i < Size / 2; i++)
            {
                data.Add(new Data(5));
            }
            data.Add(new Data(10)); // This is the spike
            for (int i = 0; i < Size / 2 - 1; i++)
            {
                data.Add(new Data(5));
            }

            // Convert to statically-typed data view.
            var staticData = dataView.AssertStatic(env, c => new { Value = c.R4.Scalar });
            // Build the pipeline
            var staticLearningPipeline = staticData.MakeNewEstimator()
                                         .Append(r => r.Value.IidSpikeDetect(80, PvalHistoryLength));
            // Train
            var detector = staticLearningPipeline.Fit(staticData);
            // Transform
            var output = detector.Transform(staticData);

            // Get predictions
            var enumerator     = env.Data.CreateEnumerable <SpikePrediction>(output.AsDynamic, true).GetEnumerator();
            var expectedValues = new List <double[]>()
            {
                //            Alert   Score   P-Value
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 1, 10, 0.0 },            // alert is on, predicted spike
                new double[] { 0, 5, 0.261375 },
                new double[] { 0, 5, 0.261375 },
                new double[] { 0, 5, 0.50 },
                new double[] { 0, 5, 0.50 }
            };

            SpikePrediction row = null;

            for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++)
            {
                row = enumerator.Current;

                CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 7);
                CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 7);
                CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 7);
            }
        }
Esempio n. 2
0
        public void SpikeDetection()
        {
            var       env  = new MLContext(1);
            const int Size = 10;
            const int PvalHistoryLength = Size / 4;

            // Generate sample series data with a spike
            List <Data> data     = new List <Data>(Size);
            var         dataView = env.Data.LoadFromEnumerable(data);

            for (int i = 0; i < Size / 2; i++)
            {
                data.Add(new Data(5));
            }
            data.Add(new Data(10)); // This is the spike
            for (int i = 0; i < Size / 2 - 1; i++)
            {
                data.Add(new Data(5));
            }

            // Build the pipeline
            var learningPipeline = ML.Transforms.DetectIidSpike("Data", "Value", 80, PvalHistoryLength);
            // Train
            var detector = learningPipeline.Fit(dataView);
            // Transform
            var output = detector.Transform(dataView);

            // Get predictions
            var enumerator     = env.Data.CreateEnumerable <SpikePrediction>(output, true).GetEnumerator();
            var expectedValues = new List <double[]>()
            {
                //            Alert   Score   P-Value
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 0, 5, 0.5 },
                new double[] { 1, 10, 0.0 },            // alert is on, predicted spike
                new double[] { 0, 5, 0.261375 },
                new double[] { 0, 5, 0.261375 },
                new double[] { 0, 5, 0.50 },
                new double[] { 0, 5, 0.50 }
            };

            SpikePrediction row = null;

            for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++)
            {
                row = enumerator.Current;

                CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 7);
                CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 7);
                CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 7);
            }
        }
        public void SsaSpikeDetection()
        {
            var       env  = new MLContext(1);
            const int size = 16;
            const int changeHistoryLength   = size / 4;
            const int trainingWindowSize    = size / 2;
            const int seasonalityWindowSize = size / 8;

            // Generate sample series data with a spike
            List <Data> data     = new List <Data>(size);
            var         dataView = env.Data.LoadFromEnumerable(data);

            for (int i = 0; i < size / 2; i++)
            {
                data.Add(new Data(5));
            }
            data.Add(new Data(10)); // This is the spike
            for (int i = 0; i < size / 2 - 1; i++)
            {
                data.Add(new Data(5));
            }

            // Build the pipeline
            var learningPipeline = ML.Transforms.DetectSpikeBySsa("Data", "Value", 80.0d, changeHistoryLength, trainingWindowSize, seasonalityWindowSize);
            // Train
            var detector = learningPipeline.Fit(dataView);
            // Transform
            var output = detector.Transform(dataView);

            // Get predictions
            var enumerator     = env.Data.CreateEnumerable <SpikePrediction>(output, true).GetEnumerator();
            var expectedValues = new List <double[]>()
            {
                //            Alert   Score   P-Value
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 1, 5.0, 0.0 },           // alert is on, predicted spike
                new double[] { 1, -2.5, 0.093146 },
                new double[] { 0, -2.5, 0.215437 },
                new double[] { 0, 0.0, 0.465745 },
                new double[] { 0, 0.0, 0.465745 },
                new double[] { 0, 0.0, 0.261375 },
                new double[] { 0, 0.0, 0.377615 },
                new double[] { 0, 0.0, 0.50 }
            };

            SpikePrediction row = null;

            for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++)
            {
                row = enumerator.Current;

                CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 6);
                CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 6);
                CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 6);
            }
        }
        public void SsaSpikeDetection()
        {
            var       env  = new MLContext(conc: 1);
            const int Size = 16;
            const int ChangeHistoryLength   = Size / 4;
            const int TrainingWindowSize    = Size / 2;
            const int SeasonalityWindowSize = Size / 8;

            // Generate sample series data with a spike
            List <Data> data     = new List <Data>(Size);
            var         dataView = env.CreateStreamingDataView(data);

            for (int i = 0; i < Size / 2; i++)
            {
                data.Add(new Data(5));
            }
            data.Add(new Data(10)); // This is the spike
            for (int i = 0; i < Size / 2 - 1; i++)
            {
                data.Add(new Data(5));
            }

            // Convert to statically-typed data view.
            var staticData = dataView.AssertStatic(env, c => new { Value = c.R4.Scalar });
            // Build the pipeline
            var staticLearningPipeline = staticData.MakeNewEstimator()
                                         .Append(r => r.Value.SsaSpikeDetect(80, ChangeHistoryLength, TrainingWindowSize, SeasonalityWindowSize));
            // Train
            var detector = staticLearningPipeline.Fit(staticData);
            // Transform
            var output = detector.Transform(staticData);

            // Get predictions
            var enumerator     = output.AsDynamic.AsEnumerable <SpikePrediction>(env, true).GetEnumerator();
            var expectedValues = new List <double[]>()
            {
                //            Alert   Score   P-Value
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 0, 0.0, 0.5 },
                new double[] { 1, 5.0, 0.0 },           // alert is on, predicted spike
                new double[] { 1, -2.5, 0.093146 },
                new double[] { 0, -2.5, 0.215437 },
                new double[] { 0, 0.0, 0.465745 },
                new double[] { 0, 0.0, 0.465745 },
                new double[] { 0, 0.0, 0.261375 },
                new double[] { 0, 0.0, 0.377615 },
                new double[] { 0, 0.0, 0.50 }
            };

            SpikePrediction row = null;

            for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++)
            {
                row = enumerator.Current;

                CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 6);
                CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 6);
                CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 6);
            }
        }