예제 #1
0
        matrices reglas(int[,] frecuencias, int filas, int columnas)
        {
            matrices max        = new matrices();
            double   menor      = 0;
            double   maxVal     = 0;
            double   total      = 0;
            double   totalTotal = 0;
            double   errorTotal = 0;

            max.fila = new int[filas];
            for (int i = 0; i < filas; i++)
            {
                maxVal = 0;
                total  = 0;
                menor  = 0;
                for (int j = 0; j < columnas; j++)
                {
                    if (frecuencias[i, j] > maxVal)
                    {
                        max.fila[i] = j;
                    }
                    total += frecuencias[i, j];
                }
                menor       = (total - maxVal);
                totalTotal += total;
                errorTotal += menor;
            }
            errorTotal = errorTotal / totalTotal;
            return(max);
        }
예제 #2
0
        matrices oneR(Dictionary <string, List <string> > instancias)
        {
            matrices      max            = new matrices();
            List <string> posiblesValC   = posiblesValores(clase, instancias);
            List <string> posiblesValA   = new List <string>();
            List <int>    probabilidades = new List <int>();
            double        menorFrec      = 1;
            int           frecuencia     = 0;

            int[,] ultimaTab = new int[posiblesValA.Count, posiblesValC.Count];;
            for (int m = 0; m < encabezado.Keys.Count; m++)
            {
                if (m != clase && (encabezado[encabezado.ElementAt(m).Key].Key == "Nominal" || encabezado[encabezado.ElementAt(m).Key].Key == "Ordinal"))
                {
                    posiblesValA.Clear();
                    posiblesValA    = posiblesValores(m, instancias);
                    max.frecuencias = new int[posiblesValA.Count, posiblesValC.Count];
                    for (int i = 0; i < posiblesValC.Count; i++)
                    {
                        for (int j = 0; j < posiblesValA.Count; j++)
                        {
                            frecuencia            = frecuencias(m, clase, posiblesValC.ElementAt(i), posiblesValA.ElementAt(j), instancias);
                            max.frecuencias[j, i] = frecuencia;
                        }
                    }
                    if (menorFrec > menorError(max.frecuencias, posiblesValA.Count, posiblesValC.Count))
                    {
                        ultimaTab = max.frecuencias;
                        matrices ma = new matrices();
                        menorFrec = menorError(max.frecuencias, posiblesValA.Count, posiblesValC.Count);
                        max.coulmaSeleccionada = m;
                        ma       = reglas(max.frecuencias, posiblesValA.Count, posiblesValC.Count);
                        max.fila = ma.fila;
                    }
                }
            }
            max.mejor       = menorFrec;
            max.frecuencias = ultimaTab;
            return(max);
        }
예제 #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            dataGridView2.Rows.Clear();
            dataGridView2.Columns.Clear();
            int           rec         = 0;
            int           max2        = 0;
            List <string> columna     = new List <string>();
            List <string> posiblesVal = new List <string>();
            List <int>    resultados  = new List <int>();
            double        porcentaje  = 1;
            int           k           = 1;

            posiblesVal = posiblesValores(clase, instancias);
            resultados  = zeroR(posiblesVal, clase, instancias);
            if (comboBox1.SelectedItem.ToString() == "ZeroR")
            {
                llenarFrecuenciasGrid(instancias);
                foreach (string col in posiblesVal)
                {
                    DataGridViewTextBoxColumn dgvIdColumn = new DataGridViewTextBoxColumn {
                        HeaderText = col, Name = col
                    };
                    dataGridView1.Columns.Add(dgvIdColumn);
                }
                for (int i = 0; i < resultados.Count; i++)
                {
                    if (resultados.ElementAt(i) > max2)
                    {
                        max2 = resultados.ElementAt(i);
                        rec  = i;
                    }
                }

                dataGridView1.Rows.Add();
                for (int i = 0; i < posiblesVal.Count; i++)
                {
                    dataGridView1.Rows[0].Cells[i].Value = resultados.ElementAt(i);
                }
            }
            else if (comboBox1.SelectedItem.ToString() == "OneR")
            {
                llenarFrecuenciasGrid(instancias);
                matrices      max          = oneR(instancias);
                List <string> posiblesValC = posiblesValores(clase, instancias);
                List <string> posiblesValA = posiblesValores(max.coulmaSeleccionada, instancias);
                double        porcentaje2  = (1 - max.mejor) * 100;
                string        reglas       = "Columna: " + encabezado.Keys.ElementAt(max.coulmaSeleccionada);
                if (porcentaje2 != 0)
                {
                    reglas += "\nReglas:\n";
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        reglas += posiblesValA.ElementAt(i) + "--> " + posiblesValC.ElementAt(max.fila[i]) + "\n";
                    }
                    label2.Text = reglas;
                    DataGridViewTextBoxColumn dgvIdColumn1 = new DataGridViewTextBoxColumn {
                        HeaderText = "columna/clase", Name = "columna/clase"
                    };
                    dataGridView1.Columns.Add(dgvIdColumn1);
                    foreach (string col in posiblesValC)
                    {
                        DataGridViewTextBoxColumn dgvIdColumn = new DataGridViewTextBoxColumn {
                            HeaderText = col, Name = col
                        };
                        dataGridView1.Columns.Add(dgvIdColumn);
                    }
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView1.Rows.Add();
                        for (int j = 0; j < posiblesValC.Count; j++)
                        {
                            dataGridView1.Rows[i].Cells[j + 1].Value = max.frecuencias[i, j];
                        }
                    }
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView1.Rows[i].Cells[0].Value = posiblesValA.ElementAt(i);
                    }
                }
                if (comboBox2.SelectedItem.ToString() == "Hold Out")
                {
                    porcentaje = Convert.ToDouble(Microsoft.VisualBasic.Interaction.InputBox("Ingrese el porcentaje de pruebas: ", "Valores", "20"));
                    porcentaje = Convert.ToInt32((cant_instancias * porcentaje) / 100);
                    kFoldZeroR(10, Convert.ToInt32(porcentaje));
                }
                if (comboBox2.SelectedItem.ToString() == "K Fold Cross Validation")
                {
                    k = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox("Ingrese el numero de folders: ", "Valores", "2"));
                    kFoldZeroR(k, 0);
                }
            }
            else if (comboBox1.SelectedItem.ToString() == "Naive Bayes")
            {
                if (comboBox2.SelectedItem.ToString() == "Hold Out")
                {
                    porcentaje = Convert.ToDouble(Microsoft.VisualBasic.Interaction.InputBox("Ingrese el porcentaje de pruebas: ", "Valores", "20"));
                    porcentaje = Convert.ToInt32((cant_instancias * porcentaje) / 100);
                    kfoldNB(10, Convert.ToInt32(porcentaje));
                }
                if (comboBox2.SelectedItem.ToString() == "K Fold Cross Validation")
                {
                    k = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox("Ingrese el numero de folders: ", "Valores", "2"));
                    kfoldNB(k, 0);
                }
                dataGridView1.Rows.Clear();
                dataGridView1.Columns.Clear();
                dataGridView2.Rows.Clear();
                dataGridView2.Columns.Clear();
                List <double> desviacion = new List <double>();
                List <double> media      = new List <double>();
                naiveBayes(instancias, desviacion, media);
            }
        }
예제 #4
0
        void llenarFrecuenciasGrid(Dictionary <string, List <string> > instancias)
        {
            matrices      max            = new matrices();
            List <string> posiblesValC   = posiblesValores(clase, instancias);
            List <string> posiblesValA   = new List <string>();
            List <int>    probabilidades = new List <int>();
            int           frecuencia     = 0;
            int           almacenado     = 0;

            int[,] ultimaTab = new int[posiblesValA.Count, posiblesValC.Count];;
            DataGridViewTextBoxColumn dgvIdColumn1 = new DataGridViewTextBoxColumn {
                HeaderText = "columna/clase", Name = "columna/clase"
            };

            dataGridView2.Columns.Add(dgvIdColumn1);
            for (int m = 0; m < instancias.Count; m++)
            {
                if (m != clase && (encabezado[encabezado.ElementAt(m).Key].Key == "Nominal" || encabezado[encabezado.ElementAt(m).Key].Key == "Nominal"))
                {
                    posiblesValA.Clear();
                    posiblesValA    = posiblesValores(m, instancias);
                    max.frecuencias = new int[posiblesValA.Count, posiblesValC.Count];
                    for (int i = 0; i < posiblesValC.Count; i++)
                    {
                        for (int j = 0; j < posiblesValA.Count; j++)
                        {
                            frecuencia            = frecuencias(m, clase, posiblesValC.ElementAt(i), posiblesValA.ElementAt(j), instancias);
                            max.frecuencias[j, i] = frecuencia;
                        }
                    }
                }
                if (m == 0)
                {
                    foreach (string col in posiblesValC)
                    {
                        DataGridViewTextBoxColumn dgvIdColumn = new DataGridViewTextBoxColumn {
                            HeaderText = col, Name = col
                        };
                        dataGridView2.Columns.Add(dgvIdColumn);
                    }
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView2.Rows.Add();
                        for (int j = 0; j < posiblesValC.Count; j++)
                        {
                            dataGridView2.Rows[i].Cells[j + 1].Value = max.frecuencias[i, j];
                        }
                    }
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView2.Rows[i].Cells[0].Value = encabezado.Keys.ElementAt(m) + ": " + posiblesValA.ElementAt(i);
                    }
                }
                else if (m != clase)
                {
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView2.Rows.Add();
                        for (int j = 0; j < posiblesValC.Count; j++)
                        {
                            dataGridView2.Rows[i + almacenado].Cells[j + 1].Value = max.frecuencias[i, j];
                        }
                    }
                    for (int i = 0; i < posiblesValA.Count; i++)
                    {
                        dataGridView2.Rows[i + almacenado].Cells[0].Value = encabezado.Keys.ElementAt(m) + ": " + posiblesValA.ElementAt(i);
                    }
                }
                almacenado += posiblesValA.Count();
            }
        }
예제 #5
0
        private void kFoldZeroR(int k, int hold)
        {
            Dictionary <string, List <string> > pruebas       = new Dictionary <string, List <string> >();
            Dictionary <string, List <string> > entrenamiento = new Dictionary <string, List <string> >();
            List <string> posiblesValC  = posiblesValores(clase, instancias);
            List <int>    numGen        = new List <int>();
            int           separador     = 0;
            int           divicion      = cant_instancias / k;
            double        exactitud     = 0;
            double        especificidad = 0;
            double        recall        = 0;

            int[,] matrizConfusion = new int[posiblesValC.Count, posiblesValC.Count];
            for (int i = 0; i < k; i++)
            {
                for (int oA = 0; oA < posiblesValC.Count; oA++)
                {
                    for (int j = 0; j < posiblesValC.Count; j++)
                    {
                        matrizConfusion[oA, j] = 0;
                    }
                }
                pruebas.Clear();
                entrenamiento.Clear();
                if (comboBox2.SelectedItem.ToString() == "K Fold Cross Validation")
                {
                    for (int m = 0; m < instancias.Count; m++)
                    {
                        List <string> pruebasTemp       = new List <string>();
                        List <string> entrenamientoTemp = new List <string>();
                        for (int j = separador; j < divicion + separador; j++)
                        {
                            pruebasTemp.Add(instancias[encabezado.Keys.ElementAt(m)].ElementAt(j));
                        }
                        for (int j = 0; j < cant_instancias; j++)
                        {
                            if (j < separador)
                            {
                                entrenamientoTemp.Add(instancias[encabezado.Keys.ElementAt(m)].ElementAt(j));
                            }
                            if (j > separador + divicion)
                            {
                                entrenamientoTemp.Add(instancias[encabezado.Keys.ElementAt(m)].ElementAt(j));
                            }
                        }
                        pruebas.Add(encabezado.Keys.ElementAt(m), pruebasTemp);
                        entrenamiento.Add(encabezado.Keys.ElementAt(m), entrenamientoTemp);
                    }
                }
                if (comboBox2.SelectedItem.ToString() == "Hold Out")
                {
                    pruebas       = llenarPruebas(hold, numGen);
                    entrenamiento = llenarEntrenamiento(numGen);
                }
                matrices      max          = oneR(entrenamiento);
                List <string> posiblesValA = posiblesValores(max.coulmaSeleccionada, instancias);
                for (int x = 0; x < pruebas[encabezado.Keys.ElementAt(0)].Count; x++)
                {
                    for (int z = 0; z < posiblesValA.Count; z++)
                    {
                        if (pruebas[encabezado.Keys.ElementAt(max.coulmaSeleccionada)].ElementAt(x) == posiblesValA.ElementAt(z))
                        {
                            for (int g = 0; g < posiblesValC.Count; g++)
                            {
                                if (pruebas[encabezado.Keys.ElementAt(clase)].ElementAt(x) == posiblesValC.ElementAt(g))
                                {
                                    matrizConfusion[max.fila[z], g]++;
                                }
                            }
                        }
                    }
                }
                double temp  = 0;
                double temp2 = 0;
                for (int m = 0; m < posiblesValC.Count; m++)
                {
                    temp += matrizConfusion[m, m];
                }
                for (int m = 0; m < posiblesValC.Count; m++)
                {
                    for (int n = 0; n < posiblesValC.Count; n++)
                    {
                        temp2 += matrizConfusion[n, m];
                    }
                }
                temp      = temp / temp2;
                exactitud = (exactitud + temp);
                temp      = 0;
                for (int m = 0; m < posiblesValC.Count; m++)
                {
                    temp2 = 0;
                    for (int n = 0; n < posiblesValC.Count; n++)
                    {
                        temp2 += matrizConfusion[n, m];
                    }
                    if (temp2 > 0)
                    {
                        temp += matrizConfusion[m, m] / temp2;
                    }
                    else
                    {
                        temp += matrizConfusion[m, m] / 1;
                    }
                }
                temp   = temp / posiblesValC.Count;
                recall = recall + temp;
                temp   = 0;
                for (int m = 0; m < posiblesValC.Count; m++)
                {
                    temp2 = 0;
                    for (int n = 0; n < posiblesValC.Count; n++)
                    {
                        temp2 += matrizConfusion[m, n];
                    }
                    if (temp2 > 0)
                    {
                        temp += matrizConfusion[m, m] / temp2;
                    }
                    else
                    {
                        temp += matrizConfusion[m, m] / 1;
                    }
                }
                temp           = temp / posiblesValC.Count;
                especificidad += temp;
                separador     += divicion;
            }
            exactitud     = exactitud / k;
            recall        = recall / k;
            especificidad = especificidad / k;
            textBox1.Text = "Recall = " + recall * 100 + "%  Especificidad = " + especificidad * 100 + "%  Exactitud = " + exactitud * 100 + "%";
        }