machine learning - Lightweight incremental classification of 1 dimensional data in java -
i have set of pairs of observations (value, class). values natural numbers. there 2 classes. expect quite easy separate classes @ single decision point, e.g., class if value < 10, class b if value >= 10. difficulty there overlap between classes , values near decision boundary.
is there fast , lightweight way update observations , classify new data point in java problem? ideally like:
classifier.addobservation(observation); classifier.classify(value); a solution demonstration of java package , justification of choice of algorithm.
after searching ended using weka. in particular used naive bayes classifier. data structures little esoteric works , fast.
package agent.agenttype.ijcai; import weka.classifiers.classifier; import weka.classifiers.bayes.naivebayes; import weka.core.attribute; import weka.core.fastvector; import weka.core.instance; import weka.core.instances; import weka.core.sparseinstance; public class example { public static enum classlabel {a, b}; instances trainingset; fastvector att = new fastvector(2); fastvector cl = new fastvector(2); public example(){ //add class labels cl.addelement(classlabel.values()[0].name()); cl.addelement(classlabel.values()[1].name()); //set name of our value attribute attribute attribute1 = new attribute("value"); //set name of our class label atrribute attribute classattribute = new attribute("label", cl); att.addelement(attribute1); att.addelement(classattribute); //create training set uses our attributes interpret instances trainingset = new instances("trainingset", att, 2); trainingset.setclassindex(1);//tell our training set index 2 of instances class label } public void addobservationtoedge(int value, classlabel classlabel){ instance instance = new sparseinstance(2); instance.setvalue((attribute)att.elementat(0), value); //set value instance.setvalue((attribute)att.elementat(1), classlabel.name());//set our trainingset.add(instance); } public classlabel classifyvalue( int value) throws exception{ instance instanceforclassification = new sparseinstance(1); instanceforclassification.setvalue((attribute)att.elementat(0), value); instanceforclassification.setdataset(trainingset);//make instance inherit attribute labels training set classifier cmodel = (classifier)new naivebayes();//create naive bayes classifier cmodel.buildclassifier(trainingset); int labelnumber = (int) cmodel.classifyinstance(instanceforclassification); return classlabel.values()[labelnumber]; } public static void main(string[] args){ example example = new example(); example.addobservationtoedge(1, classlabel.a); example.addobservationtoedge(2, classlabel.a); example.addobservationtoedge(5, classlabel.a); example.addobservationtoedge(11, classlabel.a); example.addobservationtoedge(9, classlabel.b); example.addobservationtoedge(12, classlabel.b); example.addobservationtoedge(15, classlabel.b); example.addobservationtoedge(20, classlabel.b); try { //print classification results for(int = 0; i<20; i++){ system.out.println("value: " + + " class label:" + example.classifyvalue(i)); } } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } } output:
value: 0 class label:a value: 1 class label:a value: 2 class label:a value: 3 class label:a value: 4 class label:a value: 5 class label:a value: 6 class label:a value: 7 class label:a value: 8 class label:a value: 9 class label:a value: 10 class label:b value: 11 class label:b value: 12 class label:b value: 13 class label:b value: 14 class label:b value: 15 class label:b value: 16 class label:b value: 17 class label:b value: 18 class label:b value: 19 class label:b
Comments
Post a Comment