예제 #1
0
        public double wykonajKNN(Probka testowa, List <Probka> ListofProbes, List <Double> unikalne, string metryka, double p, int k)
        {
            Dictionary <Double, List <Double> > drogi = wypelnij(unikalne);

            oblicz(drogi, ListofProbes, testowa, metryka, p);

            sortowanie(drogi);

            int minSumaCount = minSuma(drogi);


            if (minSumaCount < k)
            {
                throw new System.ArgumentException("k jest większe niż ilość elementów sumy");
            }

            Double[] key    = new Double[unikalne.Count];
            Double[] values = new Double[unikalne.Count];

            setValues(values, key, drogi, k);

            Double minimum = min(values);

            if (minimum == -1)
            {
                return(-1);
            }

            return(key[Convert.ToInt32(minimum)]);
        }
예제 #2
0
        public static List <Probka> DoubleArrayToObject(List <double> wynik, int ileAtrybutow)
        {
            List <Probka> ListofProbes = new List <Probka>();

            for (int i = 0; i < wynik.Count; i += ileAtrybutow + 1)
            {
                Probka nowa = new Probka();
                for (int j = 0; j < ileAtrybutow; j++)
                {
                    nowa.atrybuty.Add(wynik[i + j]);
                }
                nowa.klasa = wynik[i + ileAtrybutow];
                ListofProbes.Add(nowa);
            }
            return(ListofProbes);
        }
예제 #3
0
        public static void oblicz(Dictionary <Double, List <Double> > drogi, List <Probka> ListofProbes, Probka testowa, string metryka, double p)
        {
            double suma = 0;

            for (int i = 0; i < ListofProbes.Count; i++)
            {
                if (metryka == "Metryka euklidesowa")
                {
                    suma = Metryka.MetrykaEuklides(ListofProbes[i].atrybuty, testowa.atrybuty);
                }
                if (metryka == "Metryka Manhattan")
                {
                    suma = Metryka.MetrykaManhattan(ListofProbes[i].atrybuty, testowa.atrybuty);
                }
                if (metryka == "Metryka z logarytmem")
                {
                    suma = Metryka.MetrykaLogarytm(ListofProbes[i].atrybuty, testowa.atrybuty);
                }
                if (metryka == "Metryka Czebyszewa")
                {
                    suma = Metryka.MetrykaCzebyszewa(ListofProbes[i].atrybuty, testowa.atrybuty);
                }
                if (metryka == "Metryka Minkowskiego")
                {
                    suma = Metryka.MetrykaMinkowskiego(ListofProbes[i].atrybuty, testowa.atrybuty, p);
                }
                drogi[Convert.ToInt32(ListofProbes[i].klasa)].Add(suma);
            }
        }
예제 #4
0
        //main
        public void button5_Click(object sender, EventArgs e)
        {
            int           ileAtrybutow = howManyAtribs(pathToFile, separator);
            List <Double> unikalne     = uniqueClass(pathToFile, separator);

            List <double> wynik        = txtToDoubleArray(pathToFile, separator);
            List <Probka> ListofProbes = DoubleArrayToObject(wynik, ileAtrybutow);

            ListofProbes = Normalizacja(ListofProbes, ileAtrybutow);

            Probka testowa = new Probka();

            testowa.atrybuty = atrybuty;

            int    number;
            double p = 0;
            int    k = 0;

            if (metryka == "Metryka Minkowskiego")
            {
                if (textBox4.Text != "")
                {
                    if (Int32.TryParse(textBox4.Text, out number))
                    {
                        p = Convert.ToDouble(textBox4.Text);
                    }
                    else
                    {
                        MessageBox.Show("wartość p powinna być typu double");
                    }
                }
                else
                {
                    MessageBox.Show("Proszę podać wartość p");
                }
            }

            if (textBox3.Text != "")
            {
                if (Int32.TryParse(textBox3.Text, out number))
                {
                    k = Convert.ToInt32(textBox3.Text);
                }
                else
                {
                    MessageBox.Show("wartość k powinna być liczbą całkowitą");
                }
            }
            else
            {
                MessageBox.Show("Proszę podać wartość k");
            }

            double decyzja = wykonajKNN(testowa, ListofProbes, unikalne, metryka, p, k);

            if (decyzja == -1)
            {
                label19.Text = "Nie można ustalić klasy próbki";
                return;
            }
            else
            {
                label19.Text  = "Klasa: " + decyzja;
                testowa.klasa = decyzja;
            }

            double dokladnosc = SprawdzDokladnosc(ListofProbes, unikalne, metryka, p, k);

            label22.Text = "Dokładność: " + dokladnosc.ToString("#0.##%");
        }