blob: 3e4cdf9d36542c0527ef9e4ff83c95b6249ed8b7 [file] [log] [blame]
package org.apache.samoa.moa.classifiers.rules.driftdetection;
/*
* #%L
* SAMOA
* %%
* Copyright (C) 2014 - 2015 Apache Software Foundation
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.Serializable;
/**
* Page-Hinkley Test with equal weights for all instances.
*
*/
public class PageHinkleyTest implements Serializable {
private static final long serialVersionUID = 1L;
protected double cumulativeSum;
public double getCumulativeSum() {
return cumulativeSum;
}
public double getMinimumValue() {
return minimumValue;
}
protected double minimumValue;
protected double sumAbsolutError;
protected long phinstancesSeen;
protected double threshold;
protected double alpha;
public PageHinkleyTest() {
this(0, 0);
}
public PageHinkleyTest(double threshold, double alpha) {
this.threshold = threshold;
this.alpha = alpha;
this.reset();
}
public void reset() {
this.cumulativeSum = 0.0;
this.minimumValue = Double.MAX_VALUE;
this.sumAbsolutError = 0.0;
this.phinstancesSeen = 0;
}
// Compute Page-Hinkley test
public boolean update(double error) {
this.phinstancesSeen++;
double absolutError = Math.abs(error);
this.sumAbsolutError = this.sumAbsolutError + absolutError;
if (this.phinstancesSeen > 30) {
double mT = absolutError - (this.sumAbsolutError / this.phinstancesSeen) - this.alpha;
this.cumulativeSum = this.cumulativeSum + mT; // Update the cumulative mT sum
if (this.cumulativeSum < this.minimumValue) { // Update the minimum mT value if the new mT is smaller than the current minimum
this.minimumValue = this.cumulativeSum;
}
return (((this.cumulativeSum - this.minimumValue) > this.threshold));
}
return false;
}
public PageHinkleyTest getACopy() {
PageHinkleyTest newTest = new PageHinkleyTest(this.threshold, this.alpha);
this.copyFields(newTest);
return newTest;
}
protected void copyFields(PageHinkleyTest newTest) {
newTest.cumulativeSum = this.cumulativeSum;
newTest.minimumValue = this.minimumValue;
newTest.sumAbsolutError = this.sumAbsolutError;
newTest.phinstancesSeen = this.phinstancesSeen;
}
}