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

prerna.algorithm.learning.util.MeanDistance Maven / Gradle / Ivy

The newest version!
package prerna.algorithm.learning.util;

public class MeanDistance implements IClusterDistanceMode {

	private double centroidValue;
	private double numInstances;
	private double emptyInstances;
	
	private double previousCentroidValue;
	private double changeToCentroidValue;
	private boolean previousNull;
	
	public MeanDistance() {

	}
	
	@Override
	public double getCentroidValue() {
		return this.centroidValue;
	}

	@Override
	public void addPartialToCentroidValue(Double newValue, double factor) {
		if(newValue == null) {
			previousNull = true;
			emptyInstances += factor;
			return;
		}
		
		previousNull = false;
		previousCentroidValue = centroidValue;
		changeToCentroidValue = (newValue*factor - previousCentroidValue) / (numInstances + 1);
		centroidValue += changeToCentroidValue;
		//numInstances++; do not increase numInstances for partial additions
	}
	
	@Override
	public void addToCentroidValue(Double newValue) {
		if(newValue == null) {
			previousNull = true;
			emptyInstances++;
			return;
		}
		
		previousNull = false;
		previousCentroidValue = centroidValue;
		changeToCentroidValue = (newValue - previousCentroidValue) / (numInstances + 1);
		centroidValue += changeToCentroidValue;
		numInstances++;
	}
	
	@Override
	public void removePartialFromCentroidValue(Double newValue, double factor) {
		if(newValue == null) {
			previousNull = true;
			emptyInstances -= factor;
			return;
		}
		
		previousNull = false;
		previousCentroidValue = centroidValue;
		if(numInstances == 1) {
			changeToCentroidValue = -1*centroidValue;
			centroidValue = 0;
		} else {
			changeToCentroidValue = (-1*newValue*factor + previousCentroidValue) / (numInstances - 1);
			centroidValue += changeToCentroidValue;
		}
		//numInstances--; do not decrease numInstances for partial additions
	}
	
	@Override
	public void removeFromCentroidValue(Double newValue) {
		if(newValue == null) {
			previousNull = true;
			emptyInstances--;
			return;
		}
		
		previousNull = false;
		previousCentroidValue = centroidValue;
		if(numInstances == 1) {
			changeToCentroidValue = -1*centroidValue;
			centroidValue = 0;
		} else {
			changeToCentroidValue = (-1*newValue + previousCentroidValue) / (numInstances - 1);
			centroidValue += changeToCentroidValue;
		}
		numInstances--;
	}
	
	@Override
	public double getNullRatio() {
		double e = (double)emptyInstances;
		double i = (double)numInstances;
		double total = e+i;
		if(total == 0) {
			return 0;
		} else {
			return e/(e+i);
		}
	}

	@Override
	public void reset() {
		centroidValue = 0;
		numInstances = 0;
		emptyInstances = 0;
		previousCentroidValue = 0;
		changeToCentroidValue = 0;
	}

	@Override
	public double getPreviousCentroidValue() {
		return this.previousCentroidValue;
	}

	@Override
	public Double getChangeToCentroidValue() {
		if(previousNull) {
			return null;
		}
		return this.changeToCentroidValue;
	}
	
	@Override
	public double getNumNull() {
		return this.emptyInstances;
	}

	@Override
	public double getNumInstances() {
		return this.numInstances;
	}
	
	@Override
	public boolean isPreviousNull() {
		return this.previousNull;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy