/** * Returns a random number from the distribution. * * @return A new sample from this distribution. */ @Override public double nextDouble() { double variance = nextVariance(); double mean = nd.nextDouble() * Math.sqrt(variance / n) + m; return nd.nextDouble() * Math.sqrt(variance) + mean; }
@Override public double nextMean() { double sd = Math.sqrt(nextVariance() / n); return nd.nextDouble() * sd + m; }
@Override public JsonNode sample() { double x; do { x = rand.nextDouble(); } while (x < min || x > max); return new DoubleNode(x); } }
@Test public void testEntropy() { Auc auc = new Auc(); Random gen = RandomUtils.getRandom(); Normal n0 = new Normal(-1, 1, gen); Normal n1 = new Normal(1, 1, gen); for (int i=0; i<100000; i++) { double score = n0.nextDouble(); double p = n1.pdf(score) / (n0.pdf(score) + n1.pdf(score)); auc.add(0, p); score = n1.nextDouble(); p = n1.pdf(score) / (n0.pdf(score) + n1.pdf(score)); auc.add(1, p); } Matrix m = auc.entropy(); assertEquals(-0.35, m.get(0, 0), 0.02); assertEquals(-2.36, m.get(0, 1), 0.02); assertEquals(-2.36, m.get(1, 0), 0.02); assertEquals(-0.35, m.get(1, 1), 0.02); } }