public static double logarytm(Obiekt obiekt1, Obiekt obiekt2) { double suma = 0; for (int i = 0; i < obiekt1.parametry.Count; i++) { suma += Math.Abs(Math.Log(obiekt1.parametry[i]) - Math.Log(obiekt2.parametry[i])); } return(suma); }
public static double euklides(Obiekt obiekt1, Obiekt obiekt2) { double suma = 0; for (int i = 0; i < obiekt1.parametry.Count; i++) { suma += Math.Pow(obiekt1.parametry[i] - obiekt2.parametry[i], 2); } return(Math.Sqrt(suma)); }
public static double minkowski(Obiekt obiekt1, Obiekt obiekt2, double p) { double suma = 0; for (int i = 0; i < obiekt1.parametry.Count; i++) { suma += Math.Pow(Math.Abs(obiekt1.parametry[i] - obiekt2.parametry[i]), p); } return(Math.Pow(suma, 1 / p)); }
public static double manhattan(Obiekt obiekt1, Obiekt obiekt2) { double suma = 0; for (int i = 0; i < obiekt1.parametry.Count; i++) { suma += Math.Abs(obiekt1.parametry[i] - obiekt2.parametry[i]); } return(suma); }
public static double czebyszew(Obiekt obiekt1, Obiekt obiekt2) { double suma = 0; for (int i = 0; i < obiekt1.parametry.Count; i++) { if (suma < Math.Abs(obiekt1.parametry[i] - obiekt2.parametry[i])) { suma = Math.Abs(obiekt1.parametry[i] - obiekt2.parametry[i]); } } return(suma); }
public static List <Obiekt> importData(string fileName) { string line; string[] lineSplit; List <Obiekt> allData = new List <Obiekt>(); System.IO.StreamReader file = new System.IO.StreamReader(fileName); while ((line = file.ReadLine()) != null) { List <double> parametry = new List <double>(); lineSplit = line.Split('\t'); for (int i = 0; i < (lineSplit.Length - 1); i++) { parametry.Add(double.Parse(lineSplit[i], CultureInfo.InvariantCulture)); } Obiekt data = new Obiekt(parametry, int.Parse(lineSplit[lineSplit.Length - 1])); allData.Add(data); } file.Close(); return(allData); }
public static int knn(List <Obiekt> lista, Obiekt obiekt, int k, int metryka, double p = 2) { List <Obiekt> posortowane = new List <Obiekt>(); posortowane.Add(lista[0]); switch (metryka) { case 1: for (int i = 1; i < lista.Count; i++) { bool flag = false; for (int j = 0; j < posortowane.Count; j++) { if (euklides(obiekt, lista[i]) < euklides(obiekt, posortowane[j])) { posortowane.Insert(j, lista[i]); flag = true; break; } } if (flag == false) { posortowane.Add(lista[i]); } } break; case 2: for (int i = 1; i < lista.Count; i++) { bool flag = false; for (int j = 0; j < posortowane.Count; j++) { if (manhattan(obiekt, lista[i]) < manhattan(obiekt, posortowane[j])) { posortowane.Insert(j, lista[i]); flag = true; break; } } if (flag == false) { posortowane.Add(lista[i]); } } break; case 3: for (int i = 1; i < lista.Count; i++) { bool flag = false; for (int j = 0; j < posortowane.Count; j++) { if (czebyszew(obiekt, lista[i]) < czebyszew(obiekt, posortowane[j])) { posortowane.Insert(j, lista[i]); flag = true; break; } } if (flag == false) { posortowane.Add(lista[i]); } } break; case 4: for (int i = 1; i < lista.Count; i++) { bool flag = false; for (int j = 0; j < posortowane.Count; j++) { if (minkowski(obiekt, lista[i], p) < minkowski(obiekt, posortowane[j], p)) { posortowane.Insert(j, lista[i]); flag = true; break; } } if (flag == false) { posortowane.Add(lista[i]); } } break; case 5: for (int i = 1; i < lista.Count; i++) { bool flag = false; for (int j = 0; j < posortowane.Count; j++) { if (euklides(obiekt, lista[i]) < euklides(obiekt, posortowane[j])) { posortowane.Insert(j, lista[i]); flag = true; break; } } if (flag == false) { posortowane.Add(lista[i]); } } break; } Dictionary <int, int> klasyDec = new Dictionary <int, int>(); for (int i = 0; i < k; i++) { if (klasyDec.ContainsKey(posortowane[i].klasa)) { klasyDec[posortowane[i].klasa]++; } else { klasyDec.Add(posortowane[i].klasa, 1); } } int klasa = klasyDec.Aggregate((x, y) => x.Value < y.Value ? x : y).Key; //znalezione na stackoverflow, wyszukuje klucz o najmniejszej wartości return(klasa); }