Beispiel #1
0
  /**
   * 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);
  }
Beispiel #2
0
  /**
   * 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);
  }
Beispiel #3
0
  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;
  }
Beispiel #4
0
  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;
  }
Beispiel #5
0
  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());
  }
Beispiel #6
0
  public double crearMetodo(Instances pTrain, Instances pTest, Instances pEvaluar) {
    // Cargamos las instancias clasificadas
    Instances train = pTrain;
    Instances test = pTest;
    double bestAccuracy = 0;
    double accuracy = 0;
    KNN bestKNN = null;
    int bestL = 0;
    int indice = 0;
    // Movemos el valor de L para cambiar la cantidad de las muestras
    for (int i = 2; i < 16; i++) {
      ArrayList<ArrayList<Instance>> L = crearArrays(i);

      // Le metemos las instancias a cada ArrayList
      for (ArrayList<Instance> grupoInstancias : L) {
        grupoInstancias.addAll(rellenarConInstancias(train));
      }

      // Creamos los clasificadores
      ArrayList<KNN> clasificadores = new ArrayList<KNN>(i);
      for (int j = 0; j < i; j++) {
        try {
          clasificadores.set(j, new KNN(L.get(j)));
        } catch (IndexOutOfBoundsException e) {
          clasificadores.add(new KNN(L.get(j)));
        }
      }
      // Array de resultados
      ArrayList<Instance> Resultados = new ArrayList<Instance>();
      // Clasificamos las instancias
      for (int j = 0; j < test.numInstances(); j++) {

        // Creo un Array de Instancias para guardar los resultados
        ArrayList<Instance> clasificadas = new ArrayList<Instance>();

        // Clasificamos la instancia con todo el grupo de KNN
        for (KNN knn : clasificadores) {
          clasificadas.add(knn.clasificarInstacia(2, 2, test.instance(j)));
        }
        // Escogemos la clase mayoritaria del Array de clasificadas.
        Integer[] clases = new Integer[test.classAttribute().numValues()];
        // Inicio el array a cero
        for (int k = 0; k < clases.length; k++) {
          clases[k] = 0;
        }
        // Asigno el numero de instancias con esa clase.
        for (Instance instancia : clasificadas) {
          clases[
                  instancia
                      .classAttribute()
                      .indexOfValue(instancia.stringValue(instancia.classAttribute()))] +=
              1;
        }
        // Elegir la clase mayoritaria y introducir a resultado
        int numero = 0; // numero
        indice = 0; // indice
        for (int k = 0; k < clases.length; k++) {
          if (clases[k] > numero) {
            numero = clases[k];
            indice = k;
          }
        }

        clasificadas.get(0).setClassValue(clasificadas.get(0).classAttribute().value(indice));
        Resultados.add(clasificadas.get(0));
        Evaluador ev = new Evaluador(pEvaluar);
        accuracy = ev.EvaluateModel(Resultados);
        if (accuracy > bestAccuracy) {
          bestAccuracy = accuracy;
          bestL = i;
        }
      }
    }
    System.out.println("Mejor L: " + bestL);
    System.out.println("Mejor accuracy: " + bestAccuracy);
    return accuracy;
  }
Beispiel #7
0
  /**
   * 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);
  }
Beispiel #8
0
  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);
  }
Beispiel #9
0
  /**
   * 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
Beispiel #10
0
  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);
  }
Beispiel #11
0
  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);
  }