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)]); }
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); }
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); } }
//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.##%"); }