Esempio n. 1
0
        public void TestKNN()
        {
            var samples = new List <IList <object> >
            {
                new List <object> {
                    1.5, 40.0, "Thin"
                },
                new List <object> {
                    1.5, 50.0, "Fat"
                },
                new List <object> {
                    1.5, 60.0, "Fat"
                },
                new List <object> {
                    1.6, 40.0, "Thin"
                },
                new List <object> {
                    1.6, 50.0, "Thin"
                },
                new List <object> {
                    1.6, 60.0, "Fat"
                },
                new List <object> {
                    1.6, 70.0, "Fat"
                },
                new List <object> {
                    1.7, 50.0, "Thin"
                },
                new List <object> {
                    1.7, 60.0, "Thin"
                },
                new List <object> {
                    1.7, 70.0, "Fat"
                },
                new List <object> {
                    1.7, 80.0, "Fat"
                },
                new List <object> {
                    1.8, 60.0, "Thin"
                },
                new List <object> {
                    1.8, 70.0, "Thin"
                },
                new List <object> {
                    1.8, 80.0, "Fat"
                },
                new List <object> {
                    1.8, 90.0, "Fat"
                },
                new List <object> {
                    1.9, 80.0, "Thin"
                },
                new List <object> {
                    1.9, 90.0, "Fat"
                }
            };

            KNN <double, string> algo = new KNN <double, string>(NumericCalculation.EuclideanDistance);

            // Height range: [1.5 - 2.0]
            algo.AddNormalizer(o => (o - 1.5) * 2.0);

            // Weight range: [20.0 - 100.0]
            algo.AddNormalizer(o => (o - 20.0) * 0.0125);

            // Train Data
            foreach (var sample in samples)
            {
                algo.AddTrainingData(sample.Take(2).Cast <double>(), sample[2] as string);
            }

            // Test Data
            var sameCount = samples.Count(o =>
            {
                var properties = o.Take(2).Cast <double>();
                var result     = algo.Perform(properties, 5);
                return(o[2].Equals(result));
            });

            Assert.IsTrue(sameCount * 1.0 / samples.Count > 0.88);
        }