/** * Apply the NNSSLGenerator method. * * @return */ public Pair<PrototypeSet, PrototypeSet> applyAlgorithm() { System.out.print("\nThe algorithm SELF TRAINING is starting...\n Computing...\n"); PrototypeSet labeled; PrototypeSet unlabeled; labeled = new PrototypeSet( trainingDataSet.getAllDifferentFromClass( this.numberOfClass)); // Selecting labeled prototypes from the training set. unlabeled = new PrototypeSet(trainingDataSet.getFromClass(this.numberOfClass)); PrototypeSet tranductive = new PrototypeSet(this.transductiveDataSet.clone()); PrototypeSet test = new PrototypeSet(this.testDataSet.clone()); // We have to return the classification done. for (int i = 0; i < this.transductiveDataSet.size(); i++) { tranductive .get(i) .setFirstOutput((labeled.nearestTo(this.transductiveDataSet.get(i))).getOutput(0)); } for (int i = 0; i < this.testDataSet.size(); i++) { test.get(i).setFirstOutput((labeled.nearestTo(this.testDataSet.get(i))).getOutput(0)); } // Transductive Accuracy System.out.println( "AccTrs =" + KNN.classficationAccuracy1NN(labeled, this.transductiveDataSet) * 100. / this.transductiveDataSet.size()); // test accuracy System.out.println( "AccTst =" + KNN.classficationAccuracy1NN(labeled, this.testDataSet) * 100. / this.testDataSet.size()); return new Pair<PrototypeSet, PrototypeSet>(tranductive, test); }
/** * General main for all the prototoype generators Arguments: 0: Filename with the training data * set to be condensed. 1: Filename wich will contain the test data set * * @param args Arguments of the main function. */ public static void main(String[] args) { Parameters.setUse("AVG", ""); Parameters.assertBasicArgs(args); PrototypeSet training = PrototypeGenerationAlgorithm.readPrototypeSet(args[0]); PrototypeSet test = PrototypeGenerationAlgorithm.readPrototypeSet(args[1]); AVG generator = new AVG(training); PrototypeSet resultingSet = generator.execute(); int accuracy1NN = KNN.classficationAccuracy(resultingSet, test); generator.showResultsOfAccuracy(Parameters.getFileName(), accuracy1NN, test); }
protected int NN(int nSel, double conj[][], double ejemplo[]) { double mindist, dist; int nneigh = -1; mindist = Double.POSITIVE_INFINITY; for (int i = 0; i < nSel; i++) { dist = KNN.distancia(conj[i], ejemplo); if (dist < mindist) { mindist = dist; nneigh = i; } } return nneigh; }
int nextNeighbour(boolean marcas[], double datos[][], int ej, Vector<Integer> vecinos) { int i, j, k; int pos = -1; double distmin = Double.POSITIVE_INFINITY; double distancia; double centroid[]; double prototipo[]; /*Computation of the previous centroid*/ centroid = new double[datos[0].length]; prototipo = new double[datos[0].length]; for (j = 0; j < datos[0].length; j++) { centroid[j] = 0; for (k = 0; k < vecinos.size(); k++) { centroid[j] += datos[vecinos.elementAt(k).intValue()][j]; } } for (i = 0; i < datos.length; i++) { if (marcas[i] && i != ej) { for (j = 0; j < datos[0].length; j++) { prototipo[j] = centroid[j] + datos[i][j]; prototipo[j] /= (vecinos.size() + 1); } distancia = KNN.distancia(datos[ej], prototipo); if (distancia < distmin) { distmin = distancia; pos = i; } } } return pos; }
public void ejecutar() { int i, j, l, m; double alfai; int nClases; int claseObt; boolean marcas[]; boolean notFound; int init; int clasSel[]; int baraje[]; int pos, tmp; String instanciasIN[]; String instanciasOUT[]; long tiempo = System.currentTimeMillis(); /* Getting the number of differents classes */ nClases = 0; for (i = 0; i < clasesTrain.length; i++) if (clasesTrain[i] > nClases) nClases = clasesTrain[i]; nClases++; /* Shuffle the train set */ baraje = new int[datosTrain.length]; Randomize.setSeed(semilla); for (i = 0; i < datosTrain.length; i++) baraje[i] = i; for (i = 0; i < datosTrain.length; i++) { pos = Randomize.Randint(i, datosTrain.length - 1); tmp = baraje[i]; baraje[i] = baraje[pos]; baraje[pos] = tmp; } /* * Inicialization of the flagged instaces vector for a posterior * elimination */ marcas = new boolean[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) marcas[i] = false; if (datosTrain.length > 0) { // marcas[baraje[0]] = true; //the first instance is included always nSel = n_p; if (nSel < nClases) nSel = nClases; } else { System.err.println("Input dataset is empty"); nSel = 0; } clasSel = new int[nClases]; System.out.print("Selecting initial neurons... "); // at least, there must be 1 neuron of each class at the beginning init = nClases; for (i = 0; i < nClases && i < datosTrain.length; i++) { pos = Randomize.Randint(0, datosTrain.length - 1); tmp = 0; while ((clasesTrain[pos] != i || marcas[pos]) && tmp < datosTrain.length) { pos = (pos + 1) % datosTrain.length; tmp++; } if (tmp < datosTrain.length) marcas[pos] = true; else init--; // clasSel[i] = i; } for (i = init; i < Math.min(nSel, datosTrain.length); i++) { tmp = 0; pos = Randomize.Randint(0, datosTrain.length - 1); while (marcas[pos]) { pos = (pos + 1) % datosTrain.length; tmp++; } // if(i<nClases){ // notFound = true; // do{ // for(j=i-1;j>=0 && notFound;j--){ // if(clasSel[j] == clasesTrain[pos]) // notFound = false; // } // if(!notFound) // pos = Randomize.Randint (0, datosTrain.length-1); // }while(!notFound); // } // clasSel[i] = clasesTrain[pos]; marcas[pos] = true; init++; } nSel = init; System.out.println("Initial neurons selected: " + nSel); /* Building of the S set from the flags */ conjS = new double[nSel][datosTrain[0].length]; clasesS = new int[nSel]; for (m = 0, l = 0; m < datosTrain.length; m++) { if (marcas[m]) { // the instance must be copied to the solution for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[m][j]; } clasesS[l] = clasesTrain[m]; l++; } } alfai = alpha; boolean change = true; /* Body of the LVQ algorithm. */ // Train the network for (int it = 0; it < T && change; it++) { change = false; alpha = alfai; for (i = 1; i < datosTrain.length; i++) { // search for the nearest neuron to training instance pos = NN(nSel, conjS, datosTrain[baraje[i]]); // nearest neuron labels correctly the class of training // instance? if (clasesS[pos] != clasesTrain[baraje[i]]) { // NO - repel // the neuron for (j = 0; j < conjS[pos].length; j++) { conjS[pos][j] = conjS[pos][j] - alpha * (datosTrain[baraje[i]][j] - conjS[pos][j]); } change = true; } else { // YES - migrate the neuron towards the input vector for (j = 0; j < conjS[pos].length; j++) { conjS[pos][j] = conjS[pos][j] + alpha * (datosTrain[baraje[i]][j] - conjS[pos][j]); } } alpha = nu * alpha; } // Shuffle again the training partition baraje = new int[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) baraje[i] = i; for (i = 0; i < datosTrain.length; i++) { pos = Randomize.Randint(i, datosTrain.length - 1); tmp = baraje[i]; baraje[i] = baraje[pos]; baraje[pos] = tmp; } } System.out.println( "LVQ " + relation + " " + (double) (System.currentTimeMillis() - tiempo) / 1000.0 + "s"); // Classify the train data set instanciasIN = new String[datosReferencia.length]; instanciasOUT = new String[datosReferencia.length]; for (i = 0; i < datosReferencia.length; i++) { /* Classify the instance selected in this iteration */ Attribute a = Attributes.getOutputAttribute(0); int tipo = a.getType(); claseObt = KNN.evaluacionKNN2(1, conjS, clasesS, datosReferencia[i], nClases); if (tipo != Attribute.NOMINAL) { instanciasIN[i] = new String(String.valueOf(clasesReferencia[i])); instanciasOUT[i] = new String(String.valueOf(claseObt)); } else { instanciasIN[i] = new String(a.getNominalValue(clasesReferencia[i])); instanciasOUT[i] = new String(a.getNominalValue(claseObt)); } } escribeSalida( ficheroSalida[0], instanciasIN, instanciasOUT, entradas, salida, nEntradas, relation); // Classify the test data set normalizarTest(); instanciasIN = new String[datosTest.length]; instanciasOUT = new String[datosTest.length]; for (i = 0; i < datosTest.length; i++) { /* Classify the instance selected in this iteration */ Attribute a = Attributes.getOutputAttribute(0); int tipo = a.getType(); claseObt = KNN.evaluacionKNN2(1, conjS, clasesS, datosTest[i], nClases); if (tipo != Attribute.NOMINAL) { instanciasIN[i] = new String(String.valueOf(clasesTest[i])); instanciasOUT[i] = new String(String.valueOf(claseObt)); } else { instanciasIN[i] = new String(a.getNominalValue(clasesTest[i])); instanciasOUT[i] = new String(a.getNominalValue(claseObt)); } } escribeSalida( ficheroSalida[1], instanciasIN, instanciasOUT, entradas, salida, nEntradas, relation); // Print the network to a file printNetworkToFile(ficheroSalida[2], referencia.getHeader()); }
/** * The main method of the class that includes the operations of the algorithm. It includes all the * operations that the algorithm has and finishes when it writes the output information into * files. */ public void run() { int S[]; int i, j, l, m; int nPos = 0, nNeg = 0; int posID; int nClases; int pos; int baraje[]; int tmp; double conjS[][]; int clasesS[]; int tamS = 0; int claseObt; int cont; int busq; boolean marcas[]; int nSel; double conjS2[][]; int clasesS2[]; double minDist, dist; long tiempo = System.currentTimeMillis(); /*CNN PART*/ /*Count of number of positive and negative examples*/ for (i = 0; i < clasesTrain.length; i++) { if (clasesTrain[i] == 0) nPos++; else nNeg++; } if (nPos > nNeg) { tmp = nPos; nPos = nNeg; nNeg = tmp; posID = 1; } else { posID = 0; } /*Inicialization of the candidates set*/ S = new int[datosTrain.length]; for (i = 0; i < S.length; i++) S[i] = Integer.MAX_VALUE; /*Inserting an element of mayority class*/ Randomize.setSeed(semilla); pos = Randomize.Randint(0, clasesTrain.length - 1); while (clasesTrain[pos] == posID) pos = (pos + 1) % clasesTrain.length; S[tamS] = pos; tamS++; /*Insert all subset of minority class*/ for (i = 0; i < clasesTrain.length; i++) { if (clasesTrain[i] == posID) { S[tamS] = i; tamS++; } } /*Algorithm body. We resort randomly the instances of T and compare with the rest of S. If an instance doesn´t classified correctly, it is inserted in S*/ baraje = new int[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) baraje[i] = i; for (i = 0; i < datosTrain.length; i++) { pos = Randomize.Randint(i, clasesTrain.length - 1); tmp = baraje[i]; baraje[i] = baraje[pos]; baraje[pos] = tmp; } for (i = 0; i < datosTrain.length; i++) { if (clasesTrain[i] != posID) { // only for mayority class instances /*Construction of the S set from the previous vector S*/ conjS = new double[tamS][datosTrain[0].length]; clasesS = new int[tamS]; for (j = 0; j < tamS; j++) { for (l = 0; l < datosTrain[0].length; l++) conjS[j][l] = datosTrain[S[j]][l]; clasesS[j] = clasesTrain[S[j]]; } /*Do KNN to the instance*/ claseObt = KNN.evaluacionKNN(k, conjS, clasesS, datosTrain[baraje[i]], 2); if (claseObt != clasesTrain[baraje[i]]) { // fail in the class, it is included in S Arrays.sort(S); busq = Arrays.binarySearch(S, baraje[i]); if (busq < 0) { S[tamS] = baraje[i]; tamS++; } } } } /*Construction of the S set from the previous vector S*/ conjS = new double[tamS][datosTrain[0].length]; clasesS = new int[tamS]; for (j = 0; j < tamS; j++) { for (l = 0; l < datosTrain[0].length; l++) conjS[j][l] = datosTrain[S[j]][l]; clasesS[j] = clasesTrain[S[j]]; } /*TOMEK LINKS PART*/ /*Inicialization of the instance flagged vector of the S set*/ marcas = new boolean[conjS.length]; for (i = 0; i < conjS.length; i++) { marcas[i] = true; } nSel = conjS.length; for (i = 0; i < conjS.length; i++) { minDist = Double.POSITIVE_INFINITY; pos = 0; for (j = 0; j < conjS.length; j++) { if (i != j) { dist = KNN.distancia(conjS[i], conjS[j]); if (dist < minDist) { minDist = dist; pos = j; } } } if (clasesS[i] != clasesS[pos]) { if (clasesS[i] != posID) { if (marcas[i] == true) { marcas[i] = false; nSel--; } } else { if (marcas[pos] == true) { marcas[pos] = false; nSel--; } } } } /*Construction of the S set from the flags*/ conjS2 = new double[nSel][conjS[0].length]; clasesS2 = new int[nSel]; for (m = 0, l = 0; m < conjS.length; m++) { if (marcas[m]) { // the instance will evaluate for (j = 0; j < conjS[0].length; j++) { conjS2[l][j] = conjS[m][j]; } clasesS2[l] = clasesS[m]; l++; } } System.out.println( "CNN_TomekLinks " + relation + " " + (double) (System.currentTimeMillis() - tiempo) / 1000.0 + "s"); OutputIS.escribeSalida( ficheroSalida[0], conjS2, clasesS2, entradas, salida, nEntradas, relation); OutputIS.escribeSalida(ficheroSalida[1], test, entradas, salida, nEntradas, relation); }
public void ejecutar() { int i, j, l, m, o; int nClases; int claseObt; boolean marcas[]; double conjS[][]; int clasesS[]; int eleS[], eleT[]; int bestAc, aciertos; int temp[]; int pos, tmp; long tiempo = System.currentTimeMillis(); /*Getting the number of different classes*/ nClases = 0; for (i = 0; i < clasesTrain.length; i++) if (clasesTrain[i] > nClases) nClases = clasesTrain[i]; nClases++; /*Inicialization of the flagged instance vector of the S set*/ marcas = new boolean[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) marcas[i] = false; /*Allocate memory for the random selection*/ m = (int) ((porcentaje * datosTrain.length) / 100.0); eleS = new int[m]; eleT = new int[datosTrain.length - m]; temp = new int[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) temp[i] = i; /** Random distribution of elements in each set */ Randomize.setSeed(semilla); for (i = 0; i < eleS.length; i++) { pos = Randomize.Randint(i, datosTrain.length - 1); tmp = temp[i]; temp[i] = temp[pos]; temp[pos] = tmp; eleS[i] = temp[i]; } for (i = 0; i < eleT.length; i++) { pos = Randomize.Randint(m + i, datosTrain.length - 1); tmp = temp[m + i]; temp[m + i] = temp[pos]; temp[pos] = tmp; eleT[i] = temp[m + i]; } for (i = 0; i < eleS.length; i++) marcas[eleS[i]] = true; /*Building of the S set from the flags*/ conjS = new double[m][datosTrain[0].length]; clasesS = new int[m]; for (o = 0, l = 0; o < datosTrain.length; o++) { if (marcas[o]) { // the instance will be evaluated for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[o][j]; } clasesS[l] = clasesTrain[o]; l++; } } /*Evaluation of the S set*/ bestAc = 0; for (i = 0; i < datosTrain.length; i++) { claseObt = KNN.evaluacionKNN2(k, conjS, clasesS, datosTrain[i], nClases); if (claseObt == clasesTrain[i]) // correct clasification bestAc++; } /*Body of the ENNRS algorithm. Change the S set in each iteration for instances of the T set until get a complete sustitution*/ for (i = 0; i < n; i++) { /*Preparation the set to interchange*/ for (j = 0; j < eleS.length; j++) { pos = Randomize.Randint(j, eleT.length - 1); tmp = eleT[j]; eleT[j] = eleT[pos]; eleT[pos] = tmp; } /*Interchange of instances*/ for (j = 0; j < eleS.length; j++) { tmp = eleS[j]; eleS[j] = eleT[j]; eleT[j] = tmp; marcas[eleS[j]] = true; marcas[eleT[j]] = false; } /*Building of the S set from the flags*/ for (o = 0, l = 0; o < datosTrain.length; o++) { if (marcas[o]) { // the instance will evaluate for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[o][j]; } clasesS[l] = clasesTrain[o]; l++; } } /*Evaluation of the S set*/ aciertos = 0; for (j = 0; j < datosTrain.length; j++) { claseObt = KNN.evaluacionKNN2(k, conjS, clasesS, datosTrain[j], nClases); if (claseObt == clasesTrain[j]) // correct clasification aciertos++; } if (aciertos > bestAc) { // keep S bestAc = aciertos; } else { // undo changes for (j = 0; j < eleS.length; j++) { tmp = eleS[j]; eleS[j] = eleT[j]; eleT[j] = tmp; marcas[eleS[j]] = true; marcas[eleT[j]] = false; } } } /*Building of the S set from the flags*/ /*Building of the S set from the flags*/ for (o = 0, l = 0; o < datosTrain.length; o++) { if (marcas[o]) { // the instance will evaluate for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[o][j]; } clasesS[l] = clasesTrain[o]; l++; } } System.out.println( "ENNRS " + relation + " " + (double) (System.currentTimeMillis() - tiempo) / 1000.0 + "s"); // COn conjS me vale. int trainRealClass[][]; int trainPrediction[][]; trainRealClass = new int[datosTrain.length][1]; trainPrediction = new int[datosTrain.length][1]; // Working on training for (i = 0; i < datosTrain.length; i++) { trainRealClass[i][0] = clasesTrain[i]; trainPrediction[i][0] = KNN.evaluate(datosTrain[i], conjS, nClases, clasesS, this.k); } KNN.writeOutput(ficheroSalida[0], trainRealClass, trainPrediction, entradas, salida, relation); // Working on test int realClass[][] = new int[datosTest.length][1]; int prediction[][] = new int[datosTest.length][1]; // Check time for (i = 0; i < realClass.length; i++) { realClass[i][0] = clasesTest[i]; prediction[i][0] = KNN.evaluate(datosTest[i], conjS, nClases, clasesS, this.k); } KNN.writeOutput(ficheroSalida[1], realClass, prediction, entradas, salida, relation); }
/** * Evaluates a chromosome * * @param datos Reference to the training set * @param real Reference to the training set (real valued) * @param nominal Reference to the training set (nominal valued) * @param nulos Reference to the training set (null values) * @param clases Output attribute of each instance * @param alfa Alpha value of the fitness function * @param kNeigh Number of neighbors for the KNN algorithm * @param nClases Number of classes of the problem * @param distanceEu True= Euclidean distance; False= HVDM */ public void evalua( double datos[][], double real[][], int nominal[][], boolean nulos[][], int clases[], double alfa, int kNeigh, int nClases, boolean distanceEu) { int i, j, l, m; int aciertos = 0; double M, s; double conjS[][]; double conjR[][]; int conjN[][]; boolean conjM[][]; int clasesS[]; int vecinos[]; int claseObt; int vecinoCercano; double dist, minDist; M = (double) datos.length; s = (double) genesActivos(); if (kNeigh > 1) { vecinos = new int[kNeigh]; conjS = new double[(int) s][datos[0].length]; conjR = new double[(int) s][datos[0].length]; conjN = new int[(int) s][datos[0].length]; conjM = new boolean[(int) s][datos[0].length]; clasesS = new int[(int) s]; for (j = 0, l = 0; j < datos.length; j++) { if (cuerpo[j]) { // the instance must be copied to the solution for (m = 0; m < datos[j].length; m++) { conjS[l][m] = datos[j][m]; conjR[l][m] = real[j][m]; conjN[l][m] = nominal[j][m]; conjM[l][m] = nulos[j][m]; } clasesS[l] = clases[j]; l++; } } for (i = 0; i < datos.length; i++) { claseObt = KNN.evaluacionKNN2( kNeigh, conjS, conjR, conjN, conjM, clasesS, datos[i], real[i], nominal[i], nulos[i], nClases, distanceEu, vecinos); if (claseObt >= 0) if (clases[i] == claseObt) aciertos++; } } else { for (i = 0; i < datos.length; i++) { vecinoCercano = -1; minDist = Double.POSITIVE_INFINITY; for (j = 0; j < datos.length; j++) { if (cuerpo[j]) { // It is in S dist = KNN.distancia( datos[i], real[i], nominal[i], nulos[i], datos[j], real[j], nominal[j], nulos[j], distanceEu); if (dist < minDist && dist != 0) { minDist = dist; vecinoCercano = j; } } } if (vecinoCercano >= 0) if (clases[i] == clases[vecinoCercano]) aciertos++; } } calidad = ((double) (aciertos) / M) * alfa * 100.0; calidad += ((1.0 - alfa) * 100.0 * (M - s) / M); cruzado = false; } // end-method
public void ejecutar() { int i, j, l; boolean marcas[]; boolean marcas2[]; boolean marcastmp[]; boolean incorrect[]; int nSel; double conjS[][]; double conjR[][]; int conjN[][]; boolean conjM[][]; int clasesS[]; Vector<Integer> vecinos[]; int next; int maxneigh; int pos; int borrado; int claseObt; int nClases; long tiempo = System.currentTimeMillis(); /*Getting the number of differents classes*/ nClases = 0; for (i = 0; i < clasesTrain.length; i++) if (clasesTrain[i] > nClases) nClases = clasesTrain[i]; nClases++; /*Inicialization of the flagged instances vector for a posterior copy*/ marcas = new boolean[datosTrain.length]; marcas2 = new boolean[datosTrain.length]; incorrect = new boolean[datosTrain.length]; marcastmp = new boolean[datosTrain.length]; Arrays.fill(marcas, true); Arrays.fill(marcas2, true); Arrays.fill(incorrect, false); Arrays.fill(marcastmp, true); vecinos = new Vector[datosTrain.length]; for (i = 0; i < datosTrain.length; i++) vecinos[i] = new Vector<Integer>(); for (i = 0; i < datosTrain.length; i++) { next = nextNeighbour(marcas, datosTrain, i, vecinos[i]); for (j = 0; j < datosTrain.length; j++) marcastmp[j] = marcas[j]; while (next >= 0 && clasesTrain[next] == clasesTrain[i]) { vecinos[i].add(new Integer(next)); marcastmp[next] = false; next = nextNeighbour(marcastmp, datosTrain, i, vecinos[i]); } } maxneigh = vecinos[0].size(); pos = 0; for (i = 1; i < datosTrain.length; i++) { if (vecinos[i].size() > maxneigh) { maxneigh = vecinos[i].size(); pos = i; } } while (maxneigh > 0) { for (i = 0; i < vecinos[pos].size(); i++) { borrado = vecinos[pos].elementAt(i).intValue(); marcas[borrado] = false; for (j = 0; j < datosTrain.length; j++) { vecinos[j].removeElement(new Integer(borrado)); } vecinos[borrado].clear(); } vecinos[pos].clear(); maxneigh = vecinos[0].size(); pos = 0; for (i = 1; i < datosTrain.length; i++) { if (vecinos[i].size() > maxneigh) { maxneigh = vecinos[i].size(); pos = i; } } } /*Building of the S set from the flags*/ nSel = 0; for (i = 0; i < datosTrain.length; i++) if (marcas[i]) nSel++; conjS = new double[nSel][datosTrain[0].length]; conjR = new double[nSel][datosTrain[0].length]; conjN = new int[nSel][datosTrain[0].length]; conjM = new boolean[nSel][datosTrain[0].length]; clasesS = new int[nSel]; for (i = 0, l = 0; i < datosTrain.length; i++) { if (marcas[i]) { // the instance will be copied to the solution for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[i][j]; conjR[l][j] = realTrain[i][j]; conjN[l][j] = nominalTrain[i][j]; conjM[l][j] = nulosTrain[i][j]; } clasesS[l] = clasesTrain[i]; l++; } } for (i = 0; i < datosTrain.length; i++) { /*Apply 1-NN to the instance*/ claseObt = KNN.evaluacionKNN2( 1, conjS, conjR, conjN, conjM, clasesTrain, datosTrain[i], realTrain[i], nominalTrain[i], nulosTrain[i], nClases, true); if (claseObt != clasesTrain[i]) { incorrect[i] = true; } } for (i = 0; i < datosTrain.length; i++) vecinos[i] = new Vector<Integer>(); for (i = 0; i < datosTrain.length; i++) { if (incorrect[i]) { next = nextNeighbour(marcas2, datosTrain, i, vecinos[i]); for (j = 0; j < datosTrain.length; j++) marcastmp[j] = marcas2[j]; while (next >= 0 && clasesTrain[next] == clasesTrain[i]) { vecinos[i].add(new Integer(next)); marcastmp[next] = false; next = nextNeighbour(marcastmp, datosTrain, i, vecinos[i]); } } } maxneigh = vecinos[0].size(); pos = 0; for (i = 1; i < datosTrain.length; i++) { if (vecinos[i].size() > maxneigh) { maxneigh = vecinos[i].size(); pos = i; } } while (maxneigh > 0) { for (i = 0; i < vecinos[pos].size(); i++) { borrado = vecinos[pos].elementAt(i).intValue(); marcas2[borrado] = false; for (j = 0; j < datosTrain.length; j++) { vecinos[j].removeElement(new Integer(borrado)); } vecinos[borrado].clear(); } vecinos[pos].clear(); maxneigh = vecinos[0].size(); pos = 0; for (i = 1; i < datosTrain.length; i++) { if (vecinos[i].size() > maxneigh) { maxneigh = vecinos[i].size(); pos = i; } } } for (i = 0; i < marcas.length; i++) marcas[i] |= (marcas2[i] & incorrect[i]); /*Building of the S set from the flags*/ nSel = 0; for (i = 0; i < datosTrain.length; i++) if (marcas[i]) nSel++; conjS = new double[nSel][datosTrain[0].length]; conjR = new double[nSel][datosTrain[0].length]; conjN = new int[nSel][datosTrain[0].length]; conjM = new boolean[nSel][datosTrain[0].length]; clasesS = new int[nSel]; for (i = 0, l = 0; i < datosTrain.length; i++) { if (marcas[i]) { // the instance will be copied to the solution for (j = 0; j < datosTrain[0].length; j++) { conjS[l][j] = datosTrain[i][j]; conjR[l][j] = realTrain[i][j]; conjN[l][j] = nominalTrain[i][j]; conjM[l][j] = nulosTrain[i][j]; } clasesS[l] = clasesTrain[i]; l++; } } System.out.println( "Reconsistent " + relation + " " + (double) (System.currentTimeMillis() - tiempo) / 1000.0 + "s"); // COn conjS me vale. int trainRealClass[][]; int trainPrediction[][]; trainRealClass = new int[datosTrain.length][1]; trainPrediction = new int[datosTrain.length][1]; // Working on training for (i = 0; i < datosTrain.length; i++) { trainRealClass[i][0] = clasesTrain[i]; trainPrediction[i][0] = KNN.evaluate(datosTrain[i], conjS, nClases, clasesS, 1); } KNN.writeOutput(ficheroSalida[0], trainRealClass, trainPrediction, entradas, salida, relation); // Working on test int realClass[][] = new int[datosTest.length][1]; int prediction[][] = new int[datosTest.length][1]; // Check time for (i = 0; i < realClass.length; i++) { realClass[i][0] = clasesTest[i]; prediction[i][0] = KNN.evaluate(datosTest[i], conjS, nClases, clasesS, 1); } KNN.writeOutput(ficheroSalida[1], realClass, prediction, entradas, salida, relation); }
public void ejecutar() { double conjS[][]; double conjR[][]; int conjN[][]; boolean conjM[][]; int clasesS[]; int S[]; /* Binary Vector, to decide if the instance will be included*/ int i, j, l, cont; int nClases; int tamS; int transformations; int claseObt[]; int clasePredominante; long tiempo = System.currentTimeMillis(); transformations = 0; /*Getting the number of different classes*/ nClases = 0; for (i = 0; i < clasesTrain.length; i++) if (clasesTrain[i] > nClases) nClases = clasesTrain[i]; nClases++; if (nClases < 2) { System.err.println("Input dataset is empty"); nClases = 0; } /*Algorithm body. First, S=TS. Then, for each instance of TS, the first step is to repeat the aplication of the k-nn, and then we decide if we need to change the label of the instance or we don't need it. */ /*Inicialization of the candidates set, S=X, where X is the original Training Set*/ S = new int[datosTrain.length]; for (i = 0; i < S.length; i++) S[i] = 1; /* All included*/ tamS = datosTrain.length; System.out.print("K= " + k + "\n"); System.out.print("K'= " + k2 + "\n"); for (i = 0; i < datosTrain.length; i++) { /* I need find the k-nn of i in X - {i}, so I make conjS without i*/ conjS = new double[datosTrain.length - 1][datosTrain[0].length]; conjR = new double[datosTrain.length - 1][datosTrain[0].length]; conjN = new int[datosTrain.length - 1][datosTrain[0].length]; conjM = new boolean[datosTrain.length - 1][datosTrain[0].length]; clasesS = new int[datosTrain.length - 1]; cont = 0; for (j = 0; j < datosTrain.length; j++) { if (i != j) { for (l = 0; l < datosTrain[0].length; l++) { conjS[cont][l] = datosTrain[j][l]; conjR[cont][l] = realTrain[j][l]; conjN[cont][l] = nominalTrain[j][l]; conjM[cont][l] = nulosTrain[j][l]; } clasesS[cont] = clasesTrain[j]; cont++; } } /*Do KNN to the instance*/ claseObt = KNN.evaluacionKNN3( k, conjS, conjR, conjN, conjM, clasesS, datosTrain[i], realTrain[i], nominalTrain[i], nulosTrain[i], nClases, distanceEu); /* System.out.print("Las clases de los k vecinos m�s cercanos son\n"); for(int m=0;m<k;m++){ System.out.print(claseObt[m]+ " "); } System.out.print("\n-----------------------------------------------\n"); */ /*Now, we must check that we have at least k2 neighboors with the same class. */ int max = 0; clasePredominante = 0; for (int m = 0; m < claseObt.length; m++) { int claseDeInstancia = claseObt[m]; // Select one class. int iguales = 0; for (j = 0; j < claseObt.length; j++) { // Check numbers of instances with this class if (j != m) { // I can't count the same. if (claseObt[j] == claseDeInstancia) { iguales++; } } } // I must check if there is another class with more instances. if (iguales > max) { max = iguales; clasePredominante = claseObt[m]; } } // System.out.print("max " + max +"\n"); // System.out.print("Clase Predominante: "+clasePredominante+"\n"); /* Max+1 = number of neighbours with the same class*/ if ((max) >= k2) { /* if there are at least k2 neighbour, we change the class in S, */ if (clasePredominante != clasesTrain[i]) transformations++; clasesTrain[i] = clasePredominante; S[i] = 1; } else { /* Discard.*/ tamS--; S[i] = 0; } } System.out.print("S size resultante= " + tamS + "\n"); System.out.print("Transformations = " + transformations + "\n"); /*Construction of the S set from the previous vector S*/ conjS = new double[tamS][datosTrain[0].length]; conjR = new double[tamS][datosTrain[0].length]; conjN = new int[tamS][datosTrain[0].length]; conjM = new boolean[tamS][datosTrain[0].length]; clasesS = new int[tamS]; cont = 0; /* To establish the sets' sizes */ for (j = 0; j < datosTrain.length; j++) { if (S[j] == 1) { /* Checking the instance is included*/ for (l = 0; l < datosTrain[0].length; l++) { conjS[cont][l] = datosTrain[j][l]; conjR[cont][l] = realTrain[j][l]; conjN[cont][l] = nominalTrain[j][l]; conjM[cont][l] = nulosTrain[j][l]; } clasesS[cont] = clasesTrain[j]; cont++; } } System.out.println( "Time elapse: " + (double) (System.currentTimeMillis() - tiempo) / 1000.0 + "s"); OutputIS.escribeSalida( ficheroSalida[0], conjR, conjN, conjM, clasesS, entradas, salida, nEntradas, relation); OutputIS.escribeSalida(ficheroSalida[1], test, entradas, salida, nEntradas, relation); }