| 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% |
| */ |
| |
| /** |
| * Page-Hinkley Test with more weight for recent instances. |
| * |
| */ |
| |
| public class PageHinkleyFading extends PageHinkleyTest { |
| /** |
| * |
| */ |
| private static final long serialVersionUID = 7110953184708812339L; |
| private double fadingFactor = 0.99; |
| |
| public PageHinkleyFading() { |
| super(); |
| } |
| |
| public PageHinkleyFading(double threshold, double alpha) { |
| super(threshold, alpha); |
| } |
| |
| protected double instancesSeen; |
| |
| @Override |
| public void reset() { |
| |
| super.reset(); |
| this.instancesSeen = 0; |
| |
| } |
| |
| @Override |
| public boolean update(double error) { |
| this.instancesSeen = 1 + fadingFactor * this.instancesSeen; |
| double absolutError = Math.abs(error); |
| |
| this.sumAbsolutError = fadingFactor * this.sumAbsolutError + absolutError; |
| if (this.instancesSeen > 30) { |
| double mT = absolutError - (this.sumAbsolutError / this.instancesSeen) - 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; |
| } |
| |
| @Override |
| public PageHinkleyTest getACopy() { |
| PageHinkleyFading newTest = new PageHinkleyFading(this.threshold, this.alpha); |
| this.copyFields(newTest); |
| return newTest; |
| } |
| |
| @Override |
| protected void copyFields(PageHinkleyTest newTest) { |
| super.copyFields(newTest); |
| PageHinkleyFading newFading = (PageHinkleyFading) newTest; |
| newFading.fadingFactor = this.fadingFactor; |
| newFading.instancesSeen = this.instancesSeen; |
| } |
| } |