All Downloads are FREE. Search and download functionalities are using the official Maven repository.

moa.classifiers.multilabel.core.splitcriteria.ICVarianceReduction Maven / Gradle / Ivy

package moa.classifiers.multilabel.core.splitcriteria;

import moa.classifiers.rules.core.Utils;
import moa.core.DoubleVector;
import moa.core.ObjectRepository;
import moa.options.AbstractOptionHandler;
import moa.tasks.TaskMonitor;
import moa.classifiers.rules.multilabel.core.splitcriteria.MultiLabelSplitCriterion;;



public class ICVarianceReduction extends AbstractOptionHandler implements MultiLabelSplitCriterion {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public double getMeritOfSplit(DoubleVector[] preSplitDist, DoubleVector[][] postSplitDists) {
		double error=0;
		int numOutputs=preSplitDist.length;
		for (int i=0; i 1) {
			return (squares - sum * sum / n) / (n - 1);
		}
		return 0;
	}
	
	private double computeVariance(DoubleVector v) {
		return computeVariance(v.getValue(0), v.getValue(1), v.getValue(2));
	}

	@Override
	public double [] getBranchesSplitMerits(DoubleVector[][] postSplitDists){
		int numOutputs=postSplitDists.length;
		int numBranches=postSplitDists[0].length;
		double [] merits=new double[numBranches];
			for(int j=0; j0)
						merits[i]-=branchMeritsOutput[i];
					else
						merits[i]=Double.MIN_VALUE;
				}
			}
		return merits;
	}
	
	protected double getMeritOfSplitForOutput(DoubleVector[] preSplitDist, DoubleVector[][] postSplitDists, int outputAttributeIndex){
		return getMeritOfSplitForOutput(preSplitDist[outputAttributeIndex],postSplitDists[outputAttributeIndex]);
	}

	protected double getMeritOfSplitForOutput(DoubleVector preSplitDist, DoubleVector[] postSplitDists) {
		double merit=0;
		//count number of branches with weightSeen higher than threshold
		int count = 0; 
		for(int i = 0; i < postSplitDists.length; i++)
			if(postSplitDists[i].getValue(0) >=0.05*preSplitDist.getValue(0))
				count = count +1;
		//Consider split if all branches have required weight seen
		if(count == postSplitDists.length){
			double varPreSplit=computeVariance(preSplitDist);
			double sumVarPostSplit=0;
			double weightTotal=0;
			for (int i=0; i0)
					sumVarPostSplit+=(postSplitDists[i].getValue(0)/weightTotal*variances[i]);  //weight variance
			merit= 1 - sumVarPostSplit / varPreSplit;
		}
		/*if(merit<0 || merit>1)
			System.out.println("out of range");*/
		return merit;
	}

	public double getRangeOfMerit(DoubleVector [] preSplitDist) {
		return 1;
	}



	@Override
	public void getDescription(StringBuilder sb, int indent) {

	}

	@Override
	protected void prepareForUseImpl(TaskMonitor monitor,
			ObjectRepository repository) {		
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy