package pl.piotrsukiennik.whowhen.classification.impl.quality; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonProperty; import pl.piotrsukiennik.whowhen.classification.impl.AbstractBinaryClassifier; import pl.piotrsukiennik.whowhen.classification.impl.LabelingClassificationResult; import java.util.Arrays; import java.util.List; /** * @author Piotr Sukiennik */ @JsonAutoDetect public abstract class FeaturesQualityThresholdClassifier extends AbstractBinaryClassifier implements java.io.Serializable { @JsonProperty private Double requiredQuality = 0.0; @JsonProperty private String[] requiredLabels = null; @JsonProperty protected Integer featuresFrom; @JsonProperty protected Integer featuresTo; FeaturesQualityThresholdClassifier() { super(); } public void train( List<double[]> data ) { for ( double[] dArr : data ) { setRequiredQuality( Math.max( requiredQuality, evaluateQuality( Arrays.copyOfRange( dArr, featuresFrom, featuresTo ) ) ) ); } } public LabelingClassificationResult getClassification( double[] vector ) { if ( evaluateQuality( Arrays.copyOfRange( vector, featuresFrom, featuresTo ) ) <= getRequiredQuality() ) { return new LabelingClassificationResult( label, 1 ); } else { return new LabelingClassificationResult( "NOT_" + label, 1 ); } } @Override public LabelingClassificationResult getClassification( double[] vector, String... labels ) { if ( requiredLabels != null ) { for ( String label : labels ) { if ( Arrays.binarySearch( requiredLabels, label ) > 0 ) { return getClassification( vector ); } } } else { return getClassification( vector ); } return null; } @Override public String toString() { return this.getClass().getSimpleName() + "{" + "requiredQuality=" + requiredQuality + ", label='" + label + '\'' + '}'; } public double getRequiredQuality() { return this.requiredQuality; } public void setRequiredQuality( double requiredQuality ) { this.requiredQuality = requiredQuality; } public String[] getRequiredLabels() { return requiredLabels; } public void setRequiredLabels( String[] requiredLabels ) { this.requiredLabels = requiredLabels; if ( requiredLabels != null && requiredLabels.length > 0 ) { Arrays.sort( requiredLabels ); } } public Integer getFeaturesFrom() { return featuresFrom; } public void setFeaturesFrom( Integer featuresFrom ) { this.featuresFrom = featuresFrom; } public Integer getFeaturesTo() { return featuresTo; } public void setFeaturesTo( Integer featuresTo ) { this.featuresTo = featuresTo; } public abstract double evaluateQuality( double[] arr ); }