blob: 7dfa9ae7fb2b2a491f54a81619b8ac27662173f8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.samoa.moa.classifiers.rules.driftdetection;
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;
}
}