public static string[,] NowaTabela(string[,] tablica, int nrAtrybutu, string wartosc) { int iloscWierszy = Metody.IleWystapien(Metody.Kolumna(tablica, nrAtrybutu), wartosc); string[,] nowaTab = new string[iloscWierszy, tablica.GetLength(1)]; int wierszNowej = 0; for (int i = 0; i < tablica.GetLength(0); i++) { if (tablica[i, nrAtrybutu] == wartosc) { for (int j = 0; j < tablica.GetLength(1); j++) { nowaTab[wierszNowej, j] = tablica[i, j]; } wierszNowej++; } } return(nowaTab); }
public static double Info2(string[,] tablica, int nrKolumny) { double suma = 0; string[] wartAtrybutu = Metody.Kolumna(tablica, nrKolumny); Dictionary <string, int> tabWystapien = Metody.Wystapienia(wartAtrybutu); for (int i = 0; i < tabWystapien.Count; i++) { List <string> podzial = new List <string>(); for (int j = 0; j < wartAtrybutu.Length; j++) { if (wartAtrybutu[j] == tabWystapien.ElementAt(i).Key) { podzial.Add(tablica[j, tablica.GetLength(1) - 1]); } } suma += ((double)tabWystapien.ElementAt(i).Value / wartAtrybutu.Length) * Entropia(podzial.ToArray()); } return(suma); }
public void BudujDrzewo(string[,] dane, int idWezlaNadrzednego) { // brak obiektów (koniec budowania drzewa) if (dane.GetLength(0) == 0) { return; } // wszystkie obiekty mają tą samej klasy decyzyjnej (tworzenie liścia / decyzji) else if (Metody.Entropia(dane, dane.GetLength(1) - 1) == 0) { wezly.Add(new Wezel(idWezlaNadrzednego, typ.decyzja, dane[0, dane.GetLength(1) - 1].ToString())); return; } else { List <double> gainRatios = new List <double>(); for (int i = 0; i < dane.GetLength(1) - 1; i++) { gainRatios.Add(Metody.GainRatio(dane, i)); } int maxGainAt = gainRatios.IndexOf(gainRatios.Max()); if (gainRatios.Max() == 0) { // dane są sprzeczne to decyzja jest losowa wezly.Add(new Wezel(idWezlaNadrzednego, typ.decyzja, dane[0, dane.GetLength(1) - 1].ToString())); return; } Wezel w = new Wezel(idWezlaNadrzednego, typ.atrybut, maxGainAt.ToString()); wezly.Add(w); string[] wybranaKolumna = Metody.Kolumna(dane, maxGainAt); List <string> mozliwosci = wybranaKolumna.Distinct().ToList(); for (int i = 0; i < mozliwosci.Count; i++) { Wezel wDziecko = new Wezel(w.id, typ.wartosc, mozliwosci[i].ToString()); wezly.Add(wDziecko); BudujDrzewo(Metody.NowaTabela(dane, maxGainAt, mozliwosci[i]), wDziecko.id); } } return; }
public static double Entropia(string[,] tablica, int nrKolumny) { return(Entropia(Metody.Kolumna(tablica, nrKolumny))); }
public static double SplitInfo(string[,] tablica, int nrAtrybutu) { return(Entropia(Metody.Kolumna(tablica, nrAtrybutu))); }