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);
        }
示例#2
0
        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;
        }