package net.varkhan.data.learn.decision; import junit.framework.TestCase; import net.varkhan.base.functor.Mapper; import net.varkhan.base.functor.curry.Pair; import net.varkhan.base.functor.generator.GaussianNumberGenerator; import net.varkhan.base.functor.generator.UniformPRNGDef; import net.varkhan.data.learn.stats.InformationGain; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; /** * <b></b>. * <p/> * * @author varkhan * @date 3/2/14 * @time 12:26 PM */ public class DiscretePartitionFactoryTest extends TestCase { protected static DiscretePartitionFactory<String,Long,Double,Object> createSplitPartition(final int s) { return new DiscretePartitionFactory<String,Long,Double,Object>( new Mapper<Long,Double,Object>() { @Override public Long invoke(Double arg, Object ctx) { return arg==null ? null : arg>s ? Long.valueOf(+1) : arg<s ? Long.valueOf(-1) : Long.valueOf(0); } @Override public String toString() { return "<"+s+">($)"; } }, 3, new InformationGain<String,Object>() ); } protected static Mapper<String,Double,Object> bucket=new Mapper<String,Double,Object>() { @Override public String invoke(Double arg, Object ctx) { if(arg==null) return null; double v = arg; if(v<2) return "-"; if(v>2) return "+"; return "0"; // if(v<0) return "]...0]"; // if(v<1) return "[0..1]"; // if(v<2) return "[1..2]"; // if(v<3) return "[2..3]"; // if(v<4) return "[3..4]"; // return "[4...["; } }; protected static Iterable<Pair<Double,String>> sample(final Random rand, final int num, final double noise) { return new Iterable<Pair<Double,String>>() { @Override public Iterator<Pair<Double,String>> iterator() { final GaussianNumberGenerator<Object> rng=new GaussianNumberGenerator<Object>(new UniformPRNGDef(rand), 0, noise); return new Iterator<Pair<Double,String>>() { protected volatile int cnt=0; @Override public boolean hasNext() { return cnt<num; } @Override public Pair<Double,String> next() { cnt ++; double v = rand.nextDouble()*10-3; double b = v + rng.invoke(null); String s = bucket.invoke(b,null); // System.err.println(v+"\t-> "+s); return new Pair.Value<Double,String>(v, s); } @Override public void remove() { } }; } }; } public void testFair() throws Exception { List<Pair<Double,String>> smpl = new ArrayList<Pair<Double,String>>(); for(Pair<Double,String> s: sample(new Random(), 10000, 0.1)) smpl.add(s); for(int i=0; i<=4; i++) { DiscretePartitionFactory<String,Long,Double,Object> fact = createSplitPartition(i); Partition<Long,Double,Object> part = fact.invoke(smpl, null); System.err.println(i+"\t"+part); } } }