qminer
Version:
A C++ based data analytics platform for processing large-scale real-time streams containing structured and unstructured data
669 lines (665 loc) • 28.5 kB
HTML
<html>
<head>
<meta name="generator" content="JSDoc 3">
<meta charset="utf-8">
<title>Class: NearestNeighborAD</title>
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i" type="text/css">
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i" type="text/css">
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Inconsolata:500" type="text/css">
<link href="css/baseline.css" rel="stylesheet">
</head>
<body onload="prettyPrint()">
<nav id="jsdoc-navbar" role="navigation" class="jsdoc-navbar">
<div id="jsdoc-navbar-container">
<div id="jsdoc-navbar-content">
<a href="index.html" class="jsdoc-navbar-package-name">QMiner JavaScript API v9.4.0</a>
</div>
</div>
</nav>
<div id="jsdoc-body-container">
<div id="jsdoc-content">
<div id="jsdoc-content-container">
<div id="jsdoc-main" role="main">
<header class="page-header">
<div class="symbol-detail-labels"><span class="label label-kind">class</span> <span class="label label-static">static</span></div>
<h1><small><a href="module-analytics.html">analytics</a>.<wbr></small><span class="symbol-name">NearestNeighborAD</span></h1>
<p class="source-link">Source: <a href="analyticsdoc.js.html#source-line-742">analyticsdoc.<wbr>js:742</a></p>
<div class="symbol-classdesc">
<p>Anomaly detector that checks if the test point is too far from the nearest known point.</p>
</div>
<dl class="dl-compact">
</dl>
</header>
<section id="summary">
<div class="summary-callout">
<h2 class="summary-callout-heading">Property</h2>
<div class="summary-content">
<div class="summary-column">
<dl class="dl-summary-callout">
<dt><a href="module-analytics.NearestNeighborAD.html#init">init</a></dt>
<dd>
</dd>
</dl>
</div>
<div class="summary-column">
</div>
<div class="summary-column">
</div>
</div>
</div>
<div class="summary-callout">
<h2 class="summary-callout-heading">Methods</h2>
<div class="summary-content">
<div class="summary-column">
<dl class="dl-summary-callout">
<dt><a href="module-analytics.NearestNeighborAD.html#decisionFunction">decisionFunction(x)</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#explain">explain(x)</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#fit">fit(A[, idVec])</a></dt>
<dd>
</dd>
</dl>
</div>
<div class="summary-column">
<dl class="dl-summary-callout">
<dt><a href="module-analytics.NearestNeighborAD.html#getModel">getModel()</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#getParams">getParams()</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#partialFit">partialFit(X, recId)</a></dt>
<dd>
</dd>
</dl>
</div>
<div class="summary-column">
<dl class="dl-summary-callout">
<dt><a href="module-analytics.NearestNeighborAD.html#predict">predict(x)</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#save">save(fout)</a></dt>
<dd>
</dd>
<dt><a href="module-analytics.NearestNeighborAD.html#setParams">setParams(params)</a></dt>
<dd>
</dd>
</dl>
</div>
</div>
</div>
</section>
<section>
<h2 id="NearestNeighborAD">new <span class="symbol-name">NearestNeighborAD</span><span class="signature"><span class="signature-params">([arg])</span></span></h2>
<p>Nearest Neighbour Anomaly Detection</p>
<section>
<h3>
Example
</h3>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD({ rate: 0.1 });
// create a sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);
// create a new sparse vector
var vector = new la.SparseVector([[0, 4], [1, 0]]);
// predict if the vector is an anomaly or not
var prediction = neighbor.predict(vector);</code></pre>
</div>
</section>
<section>
<h3>Parameter</h3>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>arg</p>
</td>
<td>
<p>(<a href="module-analytics.html#~detectorParam">module:analytics~detectorParam</a> or <a href="module-fs.FIn.html">module:fs.FIn</a>)</p>
</td>
<td>
<p>Yes</p>
</td>
<td>
<p>Construction arguments. There are two ways of constructing:
<br>1. Using the <a href="module-analytics.html#~detectorParam">module:analytics~detectorParam</a> object,
<br>2. using the file input stream <a href="module-fs.FIn.html">module:fs.FIn</a>.
</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
</dl>
</section>
<section>
<h2>Property</h2>
<section>
<h3 id="init"><span class="symbol-name">init</span></h3>
<p>Returns true when the model has enough data to initialize. Type <code>boolean</code>.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD({ rate:0.05, windowSize:3 });
// check if the model has enough data
neighbor.init;</code></pre>
</div>
</section>
<dl class="dl-compact">
</dl>
</section>
<h2>Methods</h2>
<section>
<h3 id="decisionFunction"><span class="symbol-name">decisionFunction</span><span class="signature"><span class="signature-params">(x)</span> → <span class="signature-returns"> number</span></span></h3>
<p>Compares the point to the known points and returns distance to the nearest one.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);
// create a new sparse vector
var vector = new la.SparseVector([[0, 4], [1, 0]]);
// get the distance of the vector from the model
var prediction = neighbor.decisionFunction(vector); // returns 1</code></pre>
</div>
</section>
<section>
<h4>Parameter</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>x</p>
</td>
<td>
<p><a href="module-la.Vector.html">module:la.Vector</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Test vector.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code>number</code>B Distance to the nearest point.</p>
</dd>
</dl>
<h3 id="explain"><span class="symbol-name">explain</span><span class="signature"><span class="signature-params">(x)</span> → <span class="signature-returns"> <a href="module-analytics.html#~NearestNeighborADExplain">module:analytics~NearestNeighborADExplain</a></span></span></h3>
<p>Returns an object that encodes the ID of the nearest neighbor and the features that contributed to the distance.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD({ rate:0.05, windowSize:3 });
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix and provide a vector record IDs
neighbor.fit(matrix, new la.IntVector([3541, 1112, 4244]));
// create a new sparse vector
var vector = new la.SparseVector([[0, 4], [1, 0]]);
// check if the vector is an anomaly
var explanation = neighbor.explain(vector); // returns an explanation</code></pre>
</div>
</section>
<section>
<h4>Parameter</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>x</p>
</td>
<td>
<p><a href="module-la.SparseVector.html">module:la.SparseVector</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Test vector.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-analytics.html#~NearestNeighborADExplain">module:analytics~NearestNeighborADExplain</a></code>B The explanation object.</p>
</dd>
</dl>
<h3 id="fit"><span class="symbol-name">fit</span><span class="signature"><span class="signature-params">(A[, idVec])</span> → <span class="signature-returns"> <a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></span></span></h3>
<p>Analyzes the nearest neighbor distances and calculates the detector threshold based on the rate parameter.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);</code></pre>
</div>
</section>
<section>
<h4>Parameters</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>A</p>
</td>
<td>
<p><a href="module-la.SparseMatrix.html">module:la.SparseMatrix</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Matrix whose columns correspond to known examples. Gets saved as it is part of the model.</p>
</td>
</tr>
<tr>
<td>
<p>idVec</p>
</td>
<td>
<p><a href="module-la.IntVector.html">module:la.IntVector</a></p>
</td>
<td>
<p>Yes</p>
</td>
<td>
<p>An integer vector of IDs.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></code>B Self. The model is set by the matrix <code>A</code>.</p>
</dd>
</dl>
<h3 id="getModel"><span class="symbol-name">getModel</span><span class="signature"><span class="signature-params">()</span> → <span class="signature-returns"> Object</span></span></h3>
<p>Returns the model.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import analytics module
var analytics = require('qminer').analytics;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD({ rate: 0.1 });
// get the model of the object
// returns a json object { rate: 0.1, window: 0 }
var model = neighbor.getModel();</code></pre>
</div>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code>Object</code>B The object <code>neighbourModel</code> containing the properties:
<br> 1. <code>neighbourModel.rate</code> - The expected fraction of emmited anomalies.
<br> 2. <code>neighbourModel.thresh</code> - Maximal squared distance to the nearest neighbor that is not anomalous.
</p>
</dd>
</dl>
<h3 id="getParams"><span class="symbol-name">getParams</span><span class="signature"><span class="signature-params">()</span> → <span class="signature-returns"> <a href="module-analytics.html#~detectorParam">module:analytics~detectorParam</a></span></span></h3>
<p>Gets parameters.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import analytics module
var analytics = require('qminer').analytics;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// get the parameters of the object
// returns a json object { rate: 0.05 }
var params = neighbor.getParams();</code></pre>
</div>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-analytics.html#~detectorParam">module:analytics~detectorParam</a></code>B The object containing the parameters.</p>
</dd>
</dl>
<h3 id="partialFit"><span class="symbol-name">partialFit</span><span class="signature"><span class="signature-params">(X, recId)</span> → <span class="signature-returns"> <a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></span></span></h3>
<p>Adds a new point to the known points and recalculates the threshold.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);
// create a new sparse vector
var vector = new la.SparseVector([[0, 2], [1, 5]]);
// update the model with the vector
neighbor.partialFit(vector);</code></pre>
</div>
</section>
<section>
<h4>Parameters</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>X</p>
</td>
<td>
<p><a href="module-la.SparseVector.html">module:la.SparseVector</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Test example.</p>
</td>
</tr>
<tr>
<td>
<p>recId</p>
</td>
<td>
<p>number</p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Integer record ID, used in module:analytics.NearestNeighborAD.prototype.explain.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></code>B Self. The model is updated.</p>
</dd>
</dl>
<h3 id="predict"><span class="symbol-name">predict</span><span class="signature"><span class="signature-params">(x)</span> → <span class="signature-returns"> number</span></span></h3>
<p>Compares the point to the known points and returns 1 if it's too far away (based on the precalculated threshold).</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);
// create a new sparse vector
var vector = new la.SparseVector([[0, 4], [1, 0]]);
// check if the vector is an anomaly
var prediction = neighbor.predict(vector); // returns 1</code></pre>
</div>
</section>
<section>
<h4>Parameter</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>x</p>
</td>
<td>
<p><a href="module-la.SparseVector.html">module:la.SparseVector</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>Test vector.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code>number</code>B Returns 1.0 if the vector <code>x</code> is an anomaly and 0.0 otherwise.</p>
</dd>
</dl>
<h3 id="save"><span class="symbol-name">save</span><span class="signature"><span class="signature-params">(fout)</span> → <span class="signature-returns"> <a href="module-fs.FOut.html">module:fs.FOut</a></span></span></h3>
<p>Saves model to provided output stream.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import modules
var analytics = require('qminer').analytics;
var la = require('qminer').la;
var fs = require('qminer').fs;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// create a new sparse matrix
var matrix = new la.SparseMatrix([[[0, 1], [1, 2]], [[0, -2], [1, 3]], [[0, 0], [1, 1]]]);
// fit the model with the matrix
neighbor.fit(matrix);
// create an output stream object and save the model
var fout = fs.openWrite('neighbor_example.bin');
neighbor.save(fout);
fout.close();
// create a new Nearest Neighbor Anomaly model by loading the model
var fin = fs.openRead('neighbor_example.bin');
var neighbor2 = new analytics.NearestNeighborAD(fin);</code></pre>
</div>
</section>
<section>
<h4>Parameter</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>fout</p>
</td>
<td>
<p><a href="module-fs.FOut.html">module:fs.FOut</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>The output stream.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-fs.FOut.html">module:fs.FOut</a></code>B The output stream <code>fout</code>.</p>
</dd>
</dl>
<h3 id="setParams"><span class="symbol-name">setParams</span><span class="signature"><span class="signature-params">(params)</span> → <span class="signature-returns"> <a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></span></span></h3>
<p>Sets parameters.</p>
<section>
<h4>
Example
</h4>
<div>
<pre class="prettyprint"><code>// import analytics module
var analytics = require('qminer').analytics;
// create a new NearestNeighborAD object
var neighbor = new analytics.NearestNeighborAD();
// set it's parameters to rate: 0.1
neighbor.setParams({ rate: 0.1 });</code></pre>
</div>
</section>
<section>
<h4>Parameter</h4>
<table class="jsdoc-details-table">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>params</p>
</td>
<td>
<p><a href="module-analytics.html#~detectorParam">module:analytics~detectorParam</a></p>
</td>
<td>
<p> </p>
</td>
<td>
<p>The object containing the parameters.</p>
</td>
</tr>
</tbody>
</table>
</section>
<dl class="dl-compact">
<dt>Returns</dt>
<dd>
<p><code><a href="module-analytics.NearestNeighborAD.html">module:analytics.NearestNeighborAD</a></code>B Self. The parameters are updated with <code>params</code>.</p>
</dd>
</dl>
</section>
</section>
</div>
</div>
<nav id="jsdoc-toc-nav" role="navigation"></nav>
</div>
</div>
<footer id="jsdoc-footer" class="jsdoc-footer">
<div id="jsdoc-footer-container">
<p>
</p>
</div>
</footer>
<script src="scripts/jquery.min.js"></script>
<script src="scripts/tree.jquery.js"></script>
<script src="scripts/prettify.js"></script>
<script src="scripts/jsdoc-toc.js"></script>
<script src="scripts/linenumber.js"></script>
<script src="scripts/scrollanchor.js"></script>
</body>
</html>