package net.varkhan.data.learn.stats;
import net.varkhan.base.containers.set.CountingSet;
import java.util.Collection;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 12/28/13
* @time 3:20 PM
*/
public class Information<A,C> extends AbstractPurity<A,C> {
protected static final double INVLOG2 = 1.0/Math.log(2);
public double invoke(Collection<CountingSet<A>> parts, CountingSet<A> all, C ctx) {
return 1-entropy(parts);
}
protected static <A> double entropy(Collection<CountingSet<A>> parts) {
double num = 0;
double ent = 0;
for(CountingSet<A> set: parts) {
double c = set.count();
num += c;
ent += c * Math.log(c);
}
if(num==0) return 0;
return INVLOG2 * (Math.log(num) - ent/num);
}
}