public void Test_FunctionRecognitionModuleSave(int MinNoiseForPrediction, int MaxNoiseForPrediction)
        {
            #region Train and Save
            var batch = 100;

            var funcData = FunctionGenerator.CreateFunction(500, 2, 2 * Math.PI / 100);

            LearningApi api = new LearningApi();
            api.UseActionModule <object, double[][]>((notUsed, ctx) =>
            {
                var similarFuncData = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), 7, 10);

                double[][] formattedData = formatData(similarFuncData);

                return(formattedData);
            });

            double[][] initCentroids = new double[4][];
            initCentroids[0] = new double[] { 1.53, 0.63 };
            initCentroids[1] = new double[] { 4.68, -0.63 };
            initCentroids[2] = new double[] { 7.85, 0.62 };
            initCentroids[3] = new double[] { 10.99, -0.64 };

            ClusteringSettings settings = new ClusteringSettings(0, numClusters: 4, numDims: 2, KmeansAlgorithm: 2, initialCentroids: initCentroids, tolerance: 0)
            {
                KmeansMaxIterations = 1000
            };

            api.UseKMeansFunctionRecognitionModule(settings);

            KMeansFunctionRecognitonScore res;

            while (batch-- > 0)
            {
                res = api.RunBatch() as KMeansFunctionRecognitonScore;
            }

            api.Save("sinusmodel");
            #endregion

            #region Load And Predict
            var api2       = LearningApi.Load("sinusmodel");
            var noisedFunc = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), MinNoiseForPrediction, MaxNoiseForPrediction);

            double[][] data = formatData(noisedFunc);

            var predictionResult = api2.Algorithm.Predict(data, null) as KMeansFunctionRecognitionResult;

            // TRUE positives
            if (MaxNoiseForPrediction <= 10)
            {
                Assert.True(predictionResult.Loss == 1.0);
            }
            // TRUE negatives
            else if (MaxNoiseForPrediction >= 25)
            {
                Assert.False(predictionResult.Loss == 1.0);
            }
            #endregion
        }
Beispiel #2
0
        public static bool CheckOrCreateDefaultFunction(string rootPath, string file, int points, int numOfDims)
        {
            if (File.Exists(file))
            {
                return(true);
            }

            if (File.Exists(Path.Combine(rootPath, file)))
            {
                return(true);
            }

            var delta = 2 * Math.PI / points;

            List <double[]> rows = FunctionGenerator.CreateFunction(points, numOfDims, delta);

            Write2CSVFile(rows.ToArray(), Path.Combine(rootPath, file), false);

            return(false);
        }
        public void Test_FunctionRecognitionModule_CustomFunc()
        {
            #region Training
            int points = 22;
            var batch  = 100;

            /// If 2 dimensions are used, then data is formatted as:
            /// ret[dim1] = {x1,x2,..xN},
            /// ret[dim2] = {y1,y2,..,yN},
            /// Every dimension is returned as a row. Poinst of dimension are cells.
            var funcData = FunctionGenerator.CreateFunction(points, 2, 1, customFunc1);

            LearningApi api = new LearningApi();
            api.UseActionModule <object, double[][]>((notUsed, ctx) =>
            {
                var similarFuncData = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), 7, 10);

                // Formats the data to mulitidimensional array.
                double[][] formattedData = formatData(similarFuncData);

                return(formattedData);
            });

            double[][] initCentroids = new double[2][];
            initCentroids[0] = new double[] { 5.0, 10.0 };
            initCentroids[1] = new double[] { 15.0, 20.0 };

            ClusteringSettings settings = new ClusteringSettings(0, numClusters: 2, numDims: 2, KmeansAlgorithm: 2, initialCentroids: initCentroids, tolerance: 0)
            {
                KmeansMaxIterations = 1000
            };

            api.UseKMeansFunctionRecognitionModule(settings);

            KMeansFunctionRecognitonScore res;

            while (batch-- > 0)
            {
                res = api.RunBatch() as KMeansFunctionRecognitonScore;
            }
            #endregion

            #region Prediction
            int[] noises = new int[] { 5, 7, 9, 10, 3, 15, 20, 25, 30, 35, 40, 22, 15, 17, 12, 48, 61 };
            int   numOfAnomalliesDetected = 0;

            foreach (var noiseForPrediction in noises)
            {
                var noisedFunc = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), noiseForPrediction - 2, noiseForPrediction);

                m_CustFncIndx = 0;

                double[][] data = formatData(noisedFunc);

                var predictionResult = api.Algorithm.Predict(data, null) as KMeansFunctionRecognitionResult;

                //// TRUE positives
                if (noiseForPrediction <= 10)
                {
                    Assert.True(predictionResult.Loss == 1.0);
                    Debug.WriteLine($"Recognized: noise: {noiseForPrediction} - {predictionResult.Result} - {predictionResult.Loss}");
                }
                // TRUE negatives
                else if (noiseForPrediction >= 10)
                {
                    if (predictionResult.Result == false)
                    {
                        numOfAnomalliesDetected++;

                        // Result can be statistically true positive or true negative. This is because similar functions are genarated in +/- range to specified noise.
                        // If model is trained to 10% and sinilar function is created to 25%, it means that values of similar function
                        // fit range from 0-25% of referenced value. If it is below 10% (used for training in this test) then resut will be true positive.
                        Debug.WriteLine($"Anomally detected: Noise: {noiseForPrediction} - {predictionResult.Result} - {predictionResult.Loss}");
                    }
                }
            }

            // This is a statistical value. Test might theoretically fail.
            Assert.True(numOfAnomalliesDetected > 2, $"Num of anomallies detected = {numOfAnomalliesDetected}. Expected at least 2.");
            #endregion
        }
        public void Test_FunctionRecognitionModule(int points, int MinNoiseForPrediction, int MaxNoiseForPrediction)
        {
            #region Training
            var batch = 100;

            /// If 2 dimensions are used, then data is formatted as:
            /// ret[dim1] = {x1,x2,..xN},
            /// ret[dim2] = {y1,y2,..,yN},
            /// Every dimension is returned as a row. Poinst of dimension are cells.
            var funcData = FunctionGenerator.CreateFunction(points, 2, 2 * Math.PI / 100);

            LearningApi api = new LearningApi();
            api.UseActionModule <object, double[][]>((notUsed, ctx) =>
            {
                var similarFuncData = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), 7, 10);

                // Formats the data to mlitidimensional array.
                double[][] formattedData = formatData(similarFuncData);

                return(formattedData);
            });

            double[][] initCentroids = new double[4][];
            initCentroids[0] = new double[] { 1.53, 0.63 };
            initCentroids[1] = new double[] { 4.68, -0.63 };
            initCentroids[2] = new double[] { 7.85, 0.62 };
            initCentroids[3] = new double[] { 10.99, -0.64 };

            ClusteringSettings settings = new ClusteringSettings(0, numClusters: 4, numDims: 2, KmeansAlgorithm: 2, initialCentroids: initCentroids, tolerance: 0, funcRecogMethod: 2)
            {
                KmeansMaxIterations = 1000
            };

            api.UseKMeansFunctionRecognitionModule(settings);

            KMeansFunctionRecognitonScore res;

            while (batch-- > 0)
            {
                res = api.RunBatch() as KMeansFunctionRecognitonScore;
            }
            #endregion

            #region Prediction
            var noisedFunc = FunctionGenerator.CreateSimilarFromReferenceFunc(funcData.ToArray(), MinNoiseForPrediction, MaxNoiseForPrediction);

            double[][] data = formatData(noisedFunc);

            var predictionResult = api.Algorithm.Predict(data, null) as KMeansFunctionRecognitionResult;

            // TRUE positives
            if (MaxNoiseForPrediction <= 10)
            {
                Assert.True(predictionResult.Loss == 1.0);
            }
            // TRUE negatives
            else if (MaxNoiseForPrediction >= 25)
            {
                Assert.False(predictionResult.Loss == 1.0);
            }
            #endregion
        }