dp2.Avaliador.java Source code

Java tutorial

Introduction

Here is the source code for dp2.Avaliador.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package dp2;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.math3.stat.inference.ChiSquareTest;
import org.apache.lucene.util.OpenBitSet;

/**
 *
 * @author Marianna
 */
public class Avaliador {

    public static final String TIPO_QG = "Qg";
    public static final String TIPO_SUB = "Sub";
    public static final String TIPO_WRACC = "WRAcc";

    // Avaliao individual
    public static double avaliar(int TP, int FP, String tipo) {
        double qualidade = 0.0;

        switch (tipo) {
        case Avaliador.TIPO_QG:
            qualidade = Avaliador.Qg(TP, FP);
            break;
        case Avaliador.TIPO_SUB:
            qualidade = Avaliador.sub(TP, FP);
            break;
        case Avaliador.TIPO_WRACC:
            qualidade = Avaliador.WRAcc(TP, FP);
            break;
        }
        return qualidade;
    }

    private static double WRAcc(int TP, int FP) {
        if (TP == 0) {
            return 0.0;
        }
        double sup = (double) (TP + FP) / (double) D.numeroExemplos;
        double conf = (double) TP / (double) (TP + FP);
        double confD = (double) D.numeroExemplosPositivo / (double) D.numeroExemplos;
        double wracc = sup * (conf - confD);

        return wracc;
    }

    private static double Qg(int TP, int FP) {
        double qg = (double) TP / (double) (FP + 1);
        return qg;
    }

    private static double sub(int TP, int FP) {
        double sub = TP - FP;
        return sub;
    }

    private static double chi_quad(int TP, int FP) {
        // S  preciso isso para calcular via funo pronta!
        long[][] n = new long[2][2];
        n[0][0] = TP;
        n[1][0] = D.numeroExemplosPositivo - n[0][0];
        n[0][1] = FP;
        n[1][1] = D.numeroExemplosNegativo - n[0][1];

        ChiSquareTest chiTest = new ChiSquareTest();
        double chi_quad = chiTest.chiSquare(n);
        // System.out.println("Chi_quad: " + chi + "/" + chi_quad);
        // System.out.println("chi_quad: " + chi_quad);

        return chi_quad;
    }

    private static double p_value(int TP, int FP) {
        // S  preciso isso para calcular via funo pronta!
        long[][] n = new long[2][2];
        n[0][0] = TP;
        n[1][0] = D.numeroExemplosPositivo - n[0][0];
        n[0][1] = FP;
        n[1][1] = D.numeroExemplosNegativo - n[0][1];
        ChiSquareTest chiTest = new ChiSquareTest();
        // Returns the observed significance level, or p-value, associated with
        // a chi-square test of independence based on the input counts array,
        // viewed as a two-way table.
        double p_value = chiTest.chiSquareTest(n);
        // System.out.println("pvalue: " + p_value);
        return p_value;
    }

    public static int TP(boolean[] vrP) {
        int TP = 0;
        for (int i = 0; i < vrP.length; i++) {
            if (vrP[i]) {
                TP++;
            }
        }
        return TP;
    }

    public static int FP(boolean[] vrN) {
        int FP = 0;
        for (int i = 0; i < vrN.length; i++) {
            if (vrN[i]) {
                FP++;
            }
        }
        return FP;
    }

    // Vetor resultante
    public static boolean[] vetorResultantePositivo(HashSet<Integer> itens) {
        boolean[] vetorResultantePositivo = new boolean[D.numeroExemplosPositivo];

        for (int i = 0; i < D.numeroExemplosPositivo; i++) {
            vetorResultantePositivo[i] = Avaliador.patternContemplaExemplo(itens, D.Dp[i]);
            if (vetorResultantePositivo[i]) {
                Pattern.vrPCount[i]++;
            }
        }

        return vetorResultantePositivo;
    }

    public static boolean[] vetorResultanteNegativo(HashSet<Integer> itens) {
        boolean[] vetorResultanteNegativo = new boolean[D.numeroExemplosNegativo];

        for (int i = 0; i < D.numeroExemplosNegativo; i++) {
            vetorResultanteNegativo[i] = Avaliador.patternContemplaExemplo(itens, D.Dn[i]);
            if (vetorResultanteNegativo[i]) {
                Pattern.vrNCount[i]++;
            }
        }

        return vetorResultanteNegativo;
    }

    private static boolean patternContemplaExemplo(HashSet<Integer> itens, int[] exemplo) {
        Iterator iterator = itens.iterator();
        while (iterator.hasNext()) {
            int item = (int) iterator.next();
            int itemAtributo = D.itemAtributo[item];
            int itemValor = D.itemValor[item];
            if (exemplo[itemAtributo] != itemValor) {
                return false;
            }
        }
        return true;
    }

    // Valor mdio de qualidade
    public static double avaliarMedia(Pattern[] p, int k) {
        double total = 0.0;
        int i = 0;
        for (; i < k; i++) {
            total += p[i].getQualidade();
        }
        return total / (double) i;
    }

    // Valor mdio de dimenses
    public static double avaliarMediaDimensoes(Pattern[] p, int k) {
        int total = 0;
        int i = 0;
        for (; i < k; i++) {
            total += p[i].getItens().size();
        }
        return (double) total / (double) i;
    }

    public static double coberturaPositivo(Pattern[] p, int k) {
        double coberturaP = 0.0;
        boolean[] vrpGrupo = new boolean[D.numeroExemplosPositivo];

        for (int i = 0; i < k; i++) {
            boolean[] vrpItem = p[i].getVrP();
            for (int j = 0; j < vrpItem.length; j++) {
                if (vrpItem[j]) {
                    vrpGrupo[j] = true;
                }
            }
        }

        for (int i = 0; i < vrpGrupo.length; i++) {
            if (vrpGrupo[i]) {
                coberturaP = coberturaP + 1;
            }
        }
        // System.out.println("Numero P: " + coberturaP);
        coberturaP = coberturaP / (double) vrpGrupo.length;
        return coberturaP;
    }

    public static void imprimir(Pattern[] p, int kPrimeiros) {
        for (int i = 0; i < kPrimeiros; i++) {
            System.out.println(p[i].toString());
        }
    }

    // Imprime regras em texto
    public static List<liris.cnrs.fr.dm2l.mcts4dm.Pattern> imprimirRegras(Pattern[] p, int kPrimeiros) {

        List<liris.cnrs.fr.dm2l.mcts4dm.Pattern> resultPatternSet = new ArrayList<liris.cnrs.fr.dm2l.mcts4dm.Pattern>();

        for (int i = 0; i < kPrimeiros; i++) {
            // System.out.println(p[i].toString2());
            // System.out.println(p[i].getQualidade());

            OpenBitSet extent = new OpenBitSet();

            for (int j = 0; j < p[i].getVrP().length; j++) {
                if (p[i].getVrP()[j])
                    extent.set(j);
            }
            for (int j = 0; j < p[i].getVrN().length; j++) {
                if (p[i].getVrN()[j])
                    extent.set(j);
            }
            resultPatternSet.add(new liris.cnrs.fr.dm2l.mcts4dm.Pattern(p[i].getQualidade(), extent));
        }
        return resultPatternSet;
    }

    public static void imprimirDimensaoQuantidade(Pattern[] p, int kPrimeiros, int dDimensoes) {
        int[] dimensaoQuantidade = new int[dDimensoes]; // At dimenso 10
        for (int i = 0; i < kPrimeiros; i++) {
            int dimensao = p[i].getItens().size();
            dimensaoQuantidade[dimensao]++;
        }

        for (int i = 0; i < dDimensoes; i++) {
            System.out.println(/* "D" + i + ":" + */ dimensaoQuantidade[i]/* + ", " */);
        }

        System.out.println();
    }

    // Compactar dados: foco em tirar redundncia
    public static Pattern[] comprimir(Pattern[] pOrdenado) {

        int numeroSinonimos = 0;
        int numeroSub = 0;
        for (int i = 0; i < pOrdenado.length; i++) {
            Pattern p = pOrdenado[i];
            if (p == null) {
                continue;
            }
            for (int j = i + 1; j < pOrdenado.length; j++) {
                // System.out.println("i:" + i + ",j:" + j);
                if (pOrdenado[j] == null) {
                    continue;
                }
                int resultadoSobrescreve = p.sobrescreve(pOrdenado[j]);
                if (resultadoSobrescreve == -1) {

                } else if (resultadoSobrescreve == 1) {
                    p.addSub(pOrdenado[j]);
                    numeroSub++;
                    System.out.println("Sub:" + i + "/" + j);
                    // System.out.println(p.toString());
                    // System.out.println(pOrdenado[j].toString());

                    pOrdenado[j] = null;
                } else {
                    p.addSinonimo(pOrdenado[j]);
                    numeroSinonimos++;

                    System.out.println("Sin:" + i + "/" + j);
                    System.out.println(p.toString());
                    System.out.println(pOrdenado[j].toString());
                    pOrdenado[j] = null;
                }
            }
        }

        Pattern[] pComprimido = new Pattern[pOrdenado.length - numeroSinonimos - numeroSub];
        int indice = 0;
        for (int i = 0; i < pOrdenado.length; i++) {
            if (pOrdenado[i] != null) {
                pComprimido[indice++] = pOrdenado[i];
            }
        }
        System.out.println("\n\nSinonimos: " + numeroSinonimos + ", Sub: " + numeroSub);
        return pComprimido;
    }

}