Skip to content

Anomaly Detection Module

David Ray edited this page Feb 21, 2015 · 20 revisions

Anomaly Detection / Anomaly Likelihood Functionality Added!

As part of the Network API development effort, it was decided that the production of a Java™ version of the Python NuPIC Network API Demo(s) (PNA) would be one of its downstream validating deliverables. One of the PNA Demo's dependencies was the as of yet uncompleted Anomaly/AnomalyLikelihood computation classes. As such, a giant segue (read sidetrack :-P) was born!

So as a result we now have a major piece of functionality added to the "Algorithms" package which contains the classes organized around CLA Classification.

Usage

There are 3 explicit modes in which anomaly functionality can be used:

  1. Static call to obtain anomaly score.
    Ex.

    int[] currentlyActiveColumns = { 3, 5, 7 };    // Array containing col indexes    
    int[] predictedActiveColumns = { 2, 5, 6 };       
    double score = Anomaly.computeRawAnomalyScore(currentlyActiveColumns, predictedActiveColumns);     
    
  1. Factory instantiation of Anomaly instance. (Mode.PURE)
    Ex.

    Map<String, Object> params = new HashMap<>();    
    params.put(KEY_MODE, **_Mode.PURE_**);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// May be Mode.LIKELIHOOD    
    params.put(KEY_USE_MOVING_AVG, true);&nbsp;&nbsp;&nbsp;&nbsp;// Instructs the Anomaly class to compute moving  average    
    params.put(KEY_WINDOW_SIZE, 10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// #of inputs over which to compute the moving average    
    params.put(KEY_IS_WEIGHTED, true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Use a weighted moving average or not     
    
    Anomaly anomalyComputer = Anomaly.create(params);    
    double score = anomalyComputer.compute(currentlyActiveColumns, predictedActiveColumns, 0, 0);     
    
  1. Factory instantiation of Anomaly instance. (Mode.LIKELIHOOD)
    Ex.

    Map<String, Object> params = new HashMap<>();    
    params.put(KEY_MODE, **_Mode.LIKELIHOOD_**);     
    params.put(KEY_USE_MOVING_AVG, true);    
    params.put(KEY_WINDOW_SIZE, 10);    
    params.put(KEY_IS_WEIGHTED, true);    
    
    // Collect timestamp, input value (double), score (double) in a List\<Sample\>    
    List\<Sample\> samples = ...&nbsp;&nbsp;&nbsp;&nbsp;// Where Sample = Sample(timestamp, value, score)    
    Anomaly an = Anomaly.create(params);    
    AnomalyLikelihoodMetrics metrics = an.estimateAnomalyLikelihoods(samples, 10, 0);    
    // Above **AnomalyLikelihoodMetrics** contains many statistical goodies.    
    
    **To update the anomaly computer with new Samples, call:**    
    
    AnomalyLikelihoodMetrics metrics2 = an.updateAnomalyLikelihoods(\<new samples\>, **metrics.getParams()**);    
    

For more information regarding usage, please see the tests.

For updates on the new Network API package development, monitor