Example usage for weka.core Statistics lnGamma

List of usage examples for weka.core Statistics lnGamma

Introduction

In this page you can find the example usage for weka.core Statistics lnGamma.

Prototype

public static double lnGamma(double x) 

Source Link

Document

Returns natural logarithm of gamma function.

Usage

From source file:es.jarias.FMC.BDeu.java

License:Open Source License

protected double localBdeuScore(int X, Integer[] parents) {

    int numParents = parents.length;

    // Hyper-Parameters
    double ess = 10;
    double kappa = 1 / (ess + 1);

    // Count number of values for each parent
    int cardinality = 1;
    for (int i : parents) {
        cardinality *= m_numValues[i];/*  www .  j  ava  2  s .co m*/
    }

    int[][] Ni_jk = new int[cardinality][m_numValues[X]];
    double Np_ijk = (1.0 * ess) / (m_numValues[X] * cardinality);
    double Np_ij = (1.0 * ess) / cardinality;

    // initialize
    for (int j = 0; j < cardinality; j++)
        for (int k = 0; k < m_numValues[X]; k++)
            Ni_jk[j][k] = 0;

    for (int i = 0; i < m_numCases; i++) {
        int iCPT = 0;
        for (int iParent = 0; iParent < numParents; iParent++) {
            iCPT = (int) (iCPT * m_numValues[iParent] + dataset.instance(i).value(parents[iParent]));
        }
        Ni_jk[iCPT][(int) dataset.instance(i).value(X)]++;
    }

    double fLogScore = 0.0;

    for (int iParent = 0; iParent < cardinality; iParent++) {
        double N_ij = 0;
        double N_ijk = 0;

        for (int iSymbol = 0; iSymbol < m_numValues[X]; iSymbol++) {
            if (Ni_jk[iParent][iSymbol] != 0) {
                N_ijk = Ni_jk[iParent][iSymbol];
                fLogScore += Statistics.lnGamma(N_ijk + Np_ijk);
                fLogScore -= Statistics.lnGamma(Np_ijk);
                N_ij += N_ijk;
            }
        }
        if (Np_ij != 0)
            fLogScore += Statistics.lnGamma(Np_ij);
        if (Np_ij + N_ij != 0)
            fLogScore -= Statistics.lnGamma(Np_ij + N_ij);
    }
    fLogScore += Math.log(kappa) * cardinality * (m_numValues[X] - 1);

    return fLogScore;
}