private void zrobSepracjeKlasyDecyzyjnej(List <WierszSystemu> listaZTaSamaDecyzja, List <WierszSystemu> listaPozostałeWiersze) { List <Separacja> listaSeparacji = new List <Separacja>(); for (int i = 0; i < listaZTaSamaDecyzja[0].listaAtrybutow.Count() - 1; i++) { double cardC = listaZTaSamaDecyzja.Count(); double cardU = listaPozostałeWiersze.Count() + cardC; List <double> listaLicznik = new List <double>(); List <double> listaLicznikRoznaDecyzja = new List <double>(); List <double> listaLicznikZC = new List <double>(); List <double> listaLicznikZU = new List <double>(); List <double> listaStopni = new List <double>(); //C z kreska foreach (var wiersz in listaZTaSamaDecyzja) { listaLicznik.Add(wiersz.listaAtrybutow[i]); } double cZKreska = listaLicznik.Sum() / cardC; //C z daszkiem foreach (var wiersz in listaPozostałeWiersze) { listaLicznikRoznaDecyzja.Add(wiersz.listaAtrybutow[i]); } double cZDaszkiem = listaLicznikRoznaDecyzja.Sum() / (cardU - cardC); //Z od C z kreska foreach (var wiersz in listaZTaSamaDecyzja) { listaLicznikZC.Add((wiersz.listaAtrybutow[i] - cZKreska) * (wiersz.listaAtrybutow[i] - cZKreska)); } double zOdCZKreska = listaLicznikZC.Sum() / cardC; //Z od C z daszkiem foreach (var wiersz in listaPozostałeWiersze) { listaLicznikZU.Add((wiersz.listaAtrybutow[i] - cZDaszkiem) * (wiersz.listaAtrybutow[i] - cZDaszkiem)); } double zOdCZDaszkiem = listaLicznikZU.Sum() / (cardU - cardC); //S double s = ((cZKreska - cZDaszkiem) * (cZKreska - cZDaszkiem)) / (zOdCZKreska + zOdCZDaszkiem); Separacja obiekt = new Separacja(s, i + 1, listaZTaSamaDecyzja[0].listaAtrybutow.Last()); foreach (var wiersz in listaWierszy) { obiekt.listaAtrybutow.Add(wiersz.listaAtrybutow[i]); } listaSeparacji.Add(obiekt); listaSeparacji = listaSeparacji.OrderByDescending(x => x.stopien).ToList(); } listaListSepracjiWszystkichDecyzji.Add(listaSeparacji); }
private void btnLicz_Click(object sender, EventArgs e) { this.rtxtWynik.Text = ""; this.rtxtLogi.Text = ""; sLog = ""; // Wyliczanie stopnia separacji int i = 0; List <int> C, nC; List <int> aListaDecyzji = ListaKlasDecyzji(); Separacja[,] aStopnieSeparacji = new Separacja[aListaDecyzji.Count, this.aSystem.GetLength(1) - 1]; foreach (int klasa in aListaDecyzji) { C = new List <int>(); // obiekty majace ta samo decyzje co klasa nC = new List <int>(); // obiekty majace rozna decyzje od klasy for (int u = 0; u < this.aSystem.GetLength(0); u++) // row { if (this.aSystem[u, this.aSystem.GetLength(1) - 1] == klasa) { C.Add(u); } else { nC.Add(u); } } double Ck, Cd, ZCk, ZCd; double dStopienSeparacji; for (int a = 0; a < this.aSystem.GetLength(1) - 1; a++) { Ck = Cd = ZCk = ZCd = 0; // Ct foreach (int item in C) { Ck += this.aSystem[item, a]; } Ck /= (double)C.Count; // Cp foreach (int item in nC) { Cd += this.aSystem[item, a]; } Cd /= (double)nC.Count; //ZCt foreach (int item in C) { ZCk += Math.Pow(this.aSystem[item, a] - Ck, 2); } ZCk /= (double)C.Count; //ZCp foreach (int item in nC) { ZCd += Math.Pow(this.aSystem[item, a] - Cd, 2); } ZCd /= (double)nC.Count; dStopienSeparacji = (Math.Pow(Ck - Cd, 2)) / (ZCk + ZCd); sLog += "S^C" + (i + 1) + "(a" + (a + 1) + ") = " + dStopienSeparacji + "\r\n"; aStopnieSeparacji[i, a] = new Separacja(a, dStopienSeparacji, i); } i++; } //Sortowanie List <Separacja> aTmp = null; for (int k = 0; k < aStopnieSeparacji.GetLength(0); k++) { aTmp = new List <Separacja>(); for (int a = 0; a < aStopnieSeparacji.GetLength(1); a++) //przepisanie do tempa { aTmp.Add(aStopnieSeparacji[k, a]); } aTmp.Sort((x, y) => x.wartosc.CompareTo(y.wartosc)); aTmp.Reverse(); for (int a = 0; a < aStopnieSeparacji.GetLength(1); a++) // przepisanie z tempa { aStopnieSeparacji[k, a] = aTmp[a]; } } // Logi sLog += "\r\n"; sLog += "Tablica numerów atrybutów najlepiej separujących poszczególne klasy decyzyjne jest postaci:\r\n"; for (int k = 0; k < aStopnieSeparacji.GetLength(0); k++) { sLog += "Dla klasy centralnej c" + (k + 1) + ": "; for (int a = 0; a < aStopnieSeparacji.GetLength(1); a++) { sLog += "a" + (aStopnieSeparacji[k, a].argument + 1); if (a != aStopnieSeparacji.GetLength(1) - 1) { sLog += ", "; } } sLog += "\r\n"; } //procedura int atrybuty = 3; List <int> Atrybuty = null; sLog += "\r\n"; sLog += "Wybieramy " + atrybuty + " najlepsze atrybuty na podstawie naszej procedury wyboru.\r\n"; Atrybuty = WybierzAtrybuty(aStopnieSeparacji, atrybuty); //Wynik string sWynik; int[,] aWynik = new int[this.aSystem.GetLength(0), atrybuty + 1]; for (int u = 0; u < this.aSystem.GetLength(0); u++) { i = 0; for (int a = 0; a < this.aSystem.GetLength(1); a++) { if (Atrybuty.Contains(a) || a == this.aSystem.GetLength(1) - 1) { aWynik[u, i] = this.aSystem[u, a]; i++; } } } sWynik = WypiszTablice(aWynik); this.rtxtWynik.Text = sWynik; this.rtxtLogi.Text = sLog; return; }