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 }
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); }