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); }
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); }
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); } }
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(); } }
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 + "%"; }