@Override public String toString() { StringBuffer text = new StringBuffer(); text.append("\nsIB\n===\n"); text.append("\nNumber of clusters: " + m_numCluster + "\n"); for (int j = 0; j < m_numCluster; j++) { text.append( "\nCluster: " + j + " Size : " + bestT.size(j) + " Prior probability: " + Utils.doubleToString(bestT.Pt[j], 4) + "\n\n"); for (int i = 0; i < m_numAttributes; i++) { text.append("Attribute: " + m_data.attribute(i).name() + "\n"); text.append( "Probability given the cluster = " + Utils.doubleToString(bestT.Py_t.get(i, j), 4) + "\n"); } } return text.toString(); }
/** * Compute the JS divergence between an instance and a cluster, used for test data * * @param inst instance to be clustered * @param t index of the cluster * @param pi1 * @param pi2 * @return the JS divergence */ private double JS(Instance inst, int t, double pi1, double pi2) { if (Math.min(pi1, pi2) <= 0) { System.out.format( "Warning: zero or negative weights in JS calculation! (pi1 %s, pi2 %s)\n", pi1, pi2); return 0; } double sum = Utils.sum(inst.toDoubleArray()); double kl1 = 0.0, kl2 = 0.0, tmp = 0.0; for (int i = 0; i < inst.numValues(); i++) { tmp = inst.valueSparse(i) / sum; if (tmp != 0) { kl1 += tmp * Math.log(tmp / (tmp * pi1 + pi2 * bestT.Py_t.get(inst.index(i), t))); } } for (int i = 0; i < m_numAttributes; i++) { if ((tmp = bestT.Py_t.get(i, t)) != 0) { kl2 += tmp * Math.log(tmp / (inst.value(i) * pi1 / sum + pi2 * tmp)); } } return pi1 * kl1 + pi2 * kl2; }