//metoda pro vybrani nejlepsiho prediktora private void vyberNej(Uzel u) { double nej = 0; //vyber spravne rozhodovaci podminky pro statistickou metodu if (startIFZ) nej = Double.MinValue; if (startE) nej = Double.MaxValue; Prediktor nejP = null; foreach (Prediktor p in u.Prediktori){ if (p.Zisk > nej && p.Enable && startIFZ){ nej = p.Zisk; nejP = p; } if (p.Zisk < nej && p.Enable && startE){ nej = p.Zisk; nejP = p; } } if (nejP != null){ u.Prediktori.Find(p => p == nejP).Best = false; vypocty.Items.Add(nejP.Name); } }
/*private void provedVeVlaknu(Uzel u){ u.pocitaniKategorii(); //spocitej cetnosti trid prediktoru tabulkaZavislosti = u.pocitaniKategoriiVZavislosti(); //vytvoreni tabulky zavisloti mezi prediktory a predikovanym atributem /// /// /// STOP KRITERIA V PODMINCE /// /// if (u.PredikovanyAtribut.TridyPrediktora.Count > MIN_POCET_TRID_PRED_A //zkontroluj stop kriteria && u.Design.Data.Rows.Count-1 > MIN_POCET_ZAZNAMU){ stop = false; setAlg(u); //spust prislusnou statistickou metodu podle vyberu v combu vyberNej(u); //vyber nejlepsiho prediktora podle vypoctu rozdelPodleNej(u); //rozdel uzel } //u.VLAKNO.Abort(); }*/ //metoda pro vypocet informacniho zisku private void spocitej_IFZ(Uzel u) { spocitej_Entropy(u); //int pocetZaznamu = u.Design.Data.Rows.Count; /*foreach (Prediktor p in u.Prediktori){ meziVysledky(pocetZaznamu, p); }*/ //meziVysledky(pocetZaznamu, u.PredikovanyAtribut); foreach (Prediktor p in u.Prediktori){ if (p.Enable){ p.Zisk = u.PredikovanyAtribut.Zisk - p.Zisk; p.Zisk = Math.Round(p.Zisk, 5); vypocty.Items.Add(p.Name + " " + p.Zisk); } } }
//metoda pro vypocet podminene entropie void spocitej_Entropy(Uzel u) { double entropyPred = 0; int pocetZaznamu = u.Design.Data.Rows.Count; foreach(Prediktor p in u.Prediktori){ //projdi vsechny prediktory v uzlu if (p.Enable){ string jmPred = p.Name; double vysledek = 0; foreach(Kategorie k in p.TridyPrediktora){ //projdi vsechny tridy prediktora string key = jmPred+"."+k.JmTridy; //KEY pro tabulku zavislosti foreach(Kategorie trida in tabulkaZavislosti[key]){ //projdi cetnosti v tabulce zavisloti podle KEY double podil = trida.PocetVyskytu / k.PocetVyskytu; vysledek += podil * Math.Log(podil, 2); } } entropyPred = vysledek; double zisk = 0; for (int i = 0; i < p.TridyPrediktora.Count; i++){ //projdi znova vsechny tridy prediktora a dopocitej zisk double podil = p.TridyPrediktora[i].PocetVyskytu / pocetZaznamu; zisk += podil * entropyPred; } zisk = Math.Round(zisk, 4); p.Zisk = (-1)*zisk; if (!startIFZ) vypocty.Items.Add(p.Name + " " + p.Zisk); } } }
//volani statistickych metod podle comba private void setAlg(Uzel u) { string jmAlg = algoritmy.Items[algoritmy.SelectedIndex].ToString(); switch(jmAlg.ToUpper()){ case "PODMÍNĚNÁ ENTROPIE" : spocitej_Entropy(u); startE = true; break; case "INFORMAČNÍ ZISK" : spocitej_IFZ(u); startIFZ = true; break; } }
//metoda pro rozdeleni uzlu podle nejlepsiho prediktora private void rozdelPodleNej(Uzel u) { uzlyVKrocich = new List<Uzel>(); //vytvor novy seznam pro dalsi krok DataTable dt = u.Design.Data; //tabulka pro deleni Prediktor nejP = u.Prediktori.Find(p => p.Best == false); //vrat ze seznamu nejlepsiho prediktora if (nejP == null) {stop=true; return;} //jestli uz zadny neni -> skonci :-) for(int i = 0; i < nejP.TridyPrediktora.Count; i++){ //projdi vsechny tridy nejlepsiho prediktora var novyUzel = new Uzel(nejP.Name, nejP.TridyPrediktora[i].JmTridy, u.PredikovanyAtribut.Name); //vytvor novy uzel podle vstupniho var newTable = new DataTable(); //vytvor novou tabulku pro novy uzel newTable = dt.Copy(); //prekopiruj vsechna data newTable.Rows.Clear(); //vymaz radky for (int j = 0; j < dt.Rows.Count; j++){ //projdi vsechny radky vstupni tabulky if (nejP.TridyPrediktora[i].JmTridy == dt.Rows[j][nejP.Name].ToString()) //vybirej vzdy jen jednu tridu prediktora newTable.Rows.Add(dt.Rows[j].ItemArray); //vloz novy radek } novyUzel.Design.Data = newTable; //nastaveni nove tabulky novemu uzlu //pomocny list prediktoru, ktery je pak nastaven novemu uzlu var pom = new List<Prediktor>(); foreach (Prediktor copyP in u.Prediktori) pom.Add(new Prediktor { Name = copyP.Name, Enable = copyP.Enable, }); novyUzel.Prediktori.AddRange(pom.ToArray()); novyUzel.Prediktori.Find(p => p.Name == nejP.Name).Enable = false; uzlyVKrocich.Add(novyUzel); //pridej uzel do listu uzlu pro aktualni krok } strom.Add(uzlyVKrocich); //pridej uzly kroku do stromu a pridej buttony na panel int possX = u.Design.UzelB.Location.X - ((uzlyVKrocich.Count-1)*(u.Design.UzelB.Width/2)); Pen stetec = new Pen(Color.Black); foreach (Uzel but in strom[strom.Count-1]){ but.Design.UzelB.Location = new Point(possX + x, y); Point p1 = new Point(u.Design.UzelB.Location.X + (u.Design.UzelB.Width / 2), u.Design.UzelB.Location.Y + u.Design.UzelB.Height); Point p2 = new Point(but.Design.UzelB.Location.X + (but.Design.UzelB.Width / 2), but.Design.UzelB.Location.Y); //g.DrawLine(stetec, u.Design.UzelB.Location.X+(u.Design.UzelB.Width/2), u.Design.UzelB.Location.Y+u.Design.UzelB.Height, but.Design.UzelB.Location.X + (but.Design.UzelB.Width / 2), but.Design.UzelB.Location.Y); caryPocatek.Add(p1); caryKonec.Add(p2); picture.Controls.Add(but.Design.UzelB); x +=120; } picture.Invalidate(); y += 55; x = 0; }
//metoda pro otevreni a nacteni dat ze souboru - data se ukladaji do prvni tabulky v uzlu typu Uzel void openClick(object sender, EventArgs e) { krok.Enabled = true; spust.Enabled = true; klikOpen++; if (klikOpen > 1){ //pokud uz bylo kliknuto vse nastav do default picture.Controls.Clear(); vypocty.Items.Clear(); prediktori.Items.Clear(); pred_atribut.Items.Clear(); sloupceTab.Items.Clear(); g.Clear(picture.BackColor); algoritmy.Enabled = true; klikOpen=1; setCil.Enabled = true; strom = new List<List<Uzel>>(); uzlyVKrocich = new List<Uzel>(); start = 0; x = 0; y = 25; startE = false; startIFZ = false; caryKonec = new List<Point>(); caryPocatek = new List<Point>(); y = 55; } g = picture.CreateGraphics(); var main = new DataTable(); //vstupni tabulka openFile.Filter = "CSV Files (.csv)|*.csv"; //filter hodnot pro cteni souboru DialogResult dr = openFile.ShowDialog(); if (dr.Equals(DialogResult.Cancel)) return; string path = openFile.FileName; var sr = new StreamReader(path, Encoding.Default); string s = sr.ReadLine(); string []hlavicka = s.Split(splitter); sloupceTab.Items.AddRange(hlavicka); //pridani atributu do listboxu pro uvodni vyber //plneni vstupni tabulky var cols = new DataColumn[hlavicka.Length]; for (int i = 0, hlavickaLength = hlavicka.Length; i < hlavickaLength; i++) { string name = hlavicka[i]; cols[i] = new DataColumn(name); } main.Columns.AddRange(cols); while ((s = sr.ReadLine()) != null) { string []row = s.Split(splitter); main.Rows.Add(row); } //vytvoreni prvniho uzlu ve stromu var u = new Uzel(); u.Design.Data = main; u.Design.UzelB.Location = new Point((picture.Width / 2) - (u.Design.UzelB.Width), 0); uzlyVKrocich.Add(u); strom.Add(uzlyVKrocich); picture.Controls.Add(u.Design.UzelB); sr.Close(); itemDolu.Enabled = true; predNahoru.Enabled = true; }