UNPKG

@ai-on-browser/data-analysis-models

Version:

Data analysis model package without any dependencies

46 lines (42 loc) 1.1 kB
/** * Outlier Detection using Indegree Number */ export default class ODIN { // https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.296.9837&rep=rep1&type=pdf /** * @param {number} [k] Number of neighborhoods * @param {number} [t] Indegree threshold */ constructor(k = 5, t = 0) { this._k = k this._t = t } _d(a, b) { return Math.sqrt(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0)) } /** * Returns a list of the data predicted as outliers or not. * @param {Array<Array<number>>} data Training data * @returns {boolean[]} Predicted values */ predict(data) { const n = data.length const dists = [] for (let i = 0; i < n; i++) { dists[i] = [] dists[i][i] = 0 for (let j = 0; j < i; j++) { dists[i][j] = dists[j][i] = this._d(data[i], data[j]) } } const indegrees = Array(n).fill(0) for (let i = 0; i < n; i++) { const d = dists[i].map((v, k) => [v, k]) d.sort((a, b) => a[0] - b[0]) for (let k = 1; k < Math.min(this._k + 1, d.length); k++) { indegrees[d[k][1]] += 1 } } return indegrees.map(d => d <= this._t) } }