Ejemplo n.º 1
0
        //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);
            }
        }
Ejemplo n.º 2
0
        /*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);
                }
            }
        }
Ejemplo n.º 3
0
        //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);
                }
            }
        }
Ejemplo n.º 4
0
 //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;
     }
 }
Ejemplo n.º 5
0
        //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;
        }
Ejemplo n.º 6
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;
        }