moa.clusterers.outliers.AnyOut.AnyOut.java Source code

Java tutorial

Introduction

Here is the source code for moa.clusterers.outliers.AnyOut.AnyOut.java

Source

/*
 *    AnyOut.java
 *
 *    @author I. Assent, P. Kranen, C. Baldauf, T. Seidl
 *    @author G. Piskas, A. Gounaris
 * 
 *    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.
 *    
 *    
 */

package moa.clusterers.outliers.AnyOut;

import java.util.ArrayList;
import weka.core.Instance;
import moa.clusterers.outliers.MyBaseOutlierDetector;
import moa.clusterers.outliers.AnyOut.util.DataObject;
import moa.clusterers.outliers.AnyOut.util.DataSet;
import moa.options.Options;

public class AnyOut extends MyBaseOutlierDetector {
    private static final long serialVersionUID = 1L;

    private final int FIRST_OBJ_ID = 0;
    private final double minDepth = 0.5;
    private final double maxDepth = 0.9;

    private AnyOutCore anyout;
    private int idCounter;
    private int windowSize;
    private ArrayList<DataObject> objects;
    private DataSet trainingSet;
    private int trainingCount;
    private int trainingSetSize;
    private int truePositive, falsePositive, totalOutliers;
    private int outlierClass;

    public AnyOut() {
        anyout = new AnyOutCore();
    }

    @Override
    public void resetLearningImpl() {
        anyout.resetLearning();
        super.resetLearningImpl();
    }

    @Override
    protected void Init() {
        trainingCount = 0;
        truePositive = 0;
        falsePositive = 0;
        totalOutliers = 0;
        outlierClass = -1;
        trainingSetSize = anyout.trainingSetSizeOption.getValue();
        idCounter = FIRST_OBJ_ID;
        windowSize = anyout.horizonOption.getValue();
        objects = new ArrayList<DataObject>();
        super.Init();
    }

    @Override
    protected void ProcessNewStreamObj(Instance i) {
        if (trainingSetSize >= trainingCount) {
            if (trainingSet == null) {
                trainingSet = new DataSet(i.numAttributes() - 1);
            }
            //fill training set
            DataObject o = new DataObject(idCounter++, i);
            trainingSet.addObject(o);
            trainingCount++;
        } else {
            // Train once.
            if (trainingSetSize != -1) {
                anyout.train(trainingSet);
                trainingSet.clear();
                trainingSetSize = -1;
                outlierClass = i.classAttribute().numValues() - 1;
            }

            // Create DataObject from instance.
            DataObject o = new DataObject(idCounter++, i);
            objects.add(o);

            // Count ground truth.
            if (o.getClassLabel() == outlierClass) {
                totalOutliers += 1;
            }

            // Update window objects.
            if (objects.size() > windowSize) {
                DataObject obj = objects.get(0);
                objects.remove(0);
                anyout.removeObject(obj.getId());
                RemoveExpiredOutlier(new Outlier(obj.getInstance(), obj.getId(), obj));
            }

            // Calculate scores for the object.
            anyout.initObject(o.getId(), o.getFeatures());

            // Simulate anyout characteristics.
            double depth = Math.random();
            if (depth < minDepth) {
                depth = minDepth;
            } else if (depth > maxDepth) {
                depth = maxDepth;
            }

            while (anyout.moreImprovementsPossible(o.getId(), depth)) {
                anyout.improveObjectOnce(o.getId());
            }

            // Learn object into ClusTree.
            anyout.learnObject(o.getFeatures());

            // Evaluation of the window objects.
            for (DataObject obj : objects) {
                int id = obj.getId();
                if (anyout.isOutlier(id)) {
                    if (obj.isOutiler() == false) { // not already outlier.
                        // Statistics gathering.
                        if (obj.getClassLabel() == outlierClass) {
                            truePositive += 1;
                        } else {
                            falsePositive += 1;
                        }
                        AddOutlier(new Outlier(obj.getInstance(), id, obj));
                        obj.setOutiler(true);
                    }
                } else {
                    RemoveOutlier(new Outlier(obj.getInstance(), id, obj));
                    obj.setOutiler(false);
                }
            }
        }
    }

    @Override
    public String getPurposeString() {
        return "Anyout: Anytime Outlier Detector based on ClusTree";
    }

    @Override
    public Options getOptions() {
        return anyout.getOptions();
    }

    private int getWindowEnd() {
        return idCounter - 1;
    }

    private int getWindowStart() {
        int x = getWindowEnd() - windowSize + 1;
        if (x < FIRST_OBJ_ID)
            x = FIRST_OBJ_ID;
        return x;
    }

    @Override
    protected boolean IsNodeIdInWin(long id) {
        if ((getWindowStart() <= id) && (id <= getWindowEnd()))
            return true;
        else
            return false;
    }

    @Override
    public String getObjectInfo(Object o) {
        DataObject obj = (DataObject) o;
        double[] features = obj.getFeatures();
        int id = obj.getId();
        StringBuilder sb = new StringBuilder();
        sb.append("<html>");
        sb.append("<table>");
        sb.append("<tr><td><b>ID:</b></td><td>" + id + "</td></tr>");
        sb.append("<tr><td><b>X, Y:</b></td><td>" + String.format("%.4f", features[0]) + ", "
                + String.format("%.4f", features[1]) + "</td></tr>");
        sb.append("<tr><td><b>Oscore:</b></td><td>" + String.format("%.4f", anyout.getOutlierScore(id))
                + "</td></tr>");
        sb.append("<tr><td><b>Conf:</b></td><td>" + String.format("%.4f", anyout.getConfidence(id)) + "</td></tr>");
        sb.append("</table>");
        sb.append("</html>");

        return sb.toString();
    }

    @Override
    public String getStatistics() {
        StringBuilder sb = new StringBuilder();
        int sum = truePositive + falsePositive;
        sb.append("Statistics:\n\n");
        sb.append(String.format("  Outliers found: %d (%.1f%%)\n", sum, (100 * sum) / (double) totalOutliers));
        sb.append(String.format("  True positive found: %d (%.1f%%)\n", truePositive,
                (100 * truePositive) / (double) totalOutliers));
        sb.append(String.format("  False positive found: %d (%.1f%%)\n", falsePositive,
                (100 * falsePositive) / (double) totalOutliers));
        sb.append("\n");
        sb.append("  Max memory usage: " + iMaxMemUsage + " MB\n");
        sb.append("  Total process time: " + String.format("%.2f ms", nTotalRunTime / 1000.0) + "\n");

        return sb.toString();
    }
}