Ejemplo n.º 1
0
        public static int?klasyfikujObiekt(int[] obiekt, int[][] TRN, int k, Metryka metryka)
        {
            List <tst> wyniki      = new List <tst>();
            List <tst> posortowana = new List <tst>();

            // OBLICZAMY WARTOŚCI DLA KONKRETNYCH WIERSZY X
            for (int i = 0; i < TRN.Length; i++)
            {
                wyniki.Add(new tst(TRN[i].Last(), metryka(obiekt, TRN[i])));
            }

            List <double> listaDecyzji = new List <double>();
            Dictionary <double, double> sumaOdleglosci = new Dictionary <double, double>();

            posortowana = wyniki.OrderBy(tst => tst.odleglosc).ToList();

            // TWORZYMY LISTE MOZLIWYCH DECYZJI
            foreach (var _decyzjaObiektu in posortowana) // tutaj sobie zrobie k
            {
                if (!(listaDecyzji.Contains(_decyzjaObiektu.decyzja)))
                {
                    listaDecyzji.Add(_decyzjaObiektu.decyzja);
                }
            }


            //SUMUJEMY W POSORTOWANEJ JUZ LISCIE OD NAJMNIEJSZEJ DO NAJWIEKSZEJ WARTOSCI, DLUGOSC SUMY TO K
            foreach (var klasa in listaDecyzji) // sumowanie odleglosci według K
            {
                int    licznikK = 0;
                double suma     = 0;
                foreach (var odleglosci in posortowana)
                {
                    if (klasa == odleglosci.decyzja && licznikK < k)
                    {
                        suma     += odleglosci.odleglosc;
                        licznikK += 1;
                    }
                }
                sumaOdleglosci.Add(klasa, suma);
            }

            //WYSZUKUJEMY NAJMNIEJSZEJ MOZLIWEJ WARTOSCI
            var min = sumaOdleglosci.Aggregate((l, r) => l.Value < r.Value ? l : r).Key; // klucz najmniejszej wartosc

            double wartosc = 0;

            sumaOdleglosci.TryGetValue(min, out wartosc); // najmniejsza wartosc
            foreach (var minOdlglosc in sumaOdleglosci)
            {
                //JESLI NAJMNIEJSZA MOZLIWA WARTOSC JEST ROWNA WARTOSCI Z INNEJ KLASY
                if (wartosc == minOdlglosc.Value && min != minOdlglosc.Key)
                {
                    //WTEDY NIE KLASYFIKUJEMY DECYZJI
                    return(null);
                }
            }

            return(Convert.ToInt32(min)); //zwracam klucz i konwertuje
        }
Ejemplo n.º 2
0
        public string klasyfikuj(double[] ob, string[][] trn, int k, Metryka m)
        {
            Dictionary <ObiektDecyzyjny, double> d = new Dictionary <ObiektDecyzyjny, double>();
            double min;
            Dictionary <string, double> Lmin = new Dictionary <string, double>();

            ObiektDecyzyjny obiekt = new ObiektDecyzyjny();

            for (int i = 0; i < trn.Length; i++)
            {
                obiekt = utwurzObiekt(trn[i], i);
                d.Add(obiekt, m(ob, obiekt.deskryptory));
            }

            foreach (var dec in fUnkialnosc(fKolumna(trn, trn[0].Length - 1)))
            {
                min = fMin(d, dec, k);
                Lmin.Add(dec, min);
            }
            for (int i = 1; i < Lmin.Count; i++)
            {
                if (Lmin.ElementAt(i - 1).Value < Lmin.ElementAt(i).Value)
                {
                    return(Lmin.ElementAt(i - 1).Key);
                }
                else if (Lmin.ElementAt(i - 1).Value > Lmin.ElementAt(i).Value)
                {
                    return(Lmin.ElementAt(i).Key);
                }
            }

            return(null);
        }