/
kz.js
43 lines (41 loc) · 857 Bytes
/
kz.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* Kolmogorov–Zurbenko filter
*/
export default class KolmogorovZurbenkoFilter {
// https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Zurbenko_filter
/**
* @param {number} m Window size
* @param {number} k Iteration count of a moving average
*/
constructor(m, k) {
this._m = m
this._k = k
}
_ma(x) {
const p = []
const n = x.length
for (let i = 0; i < x.length; i++) {
const t1 = i - Math.floor((this._m - 1) / 2)
const t2 = t1 + this._m
p[i] = 0
for (let k = Math.max(0, t1); k < Math.min(n, t2); k++) {
p[i] += x[k]
}
p[i] /= Math.min(n, t2) - Math.max(0, t1)
}
return p
}
/**
* Returns predicted values.
*
* @param {number[]} x Training data
* @returns {number[]} Predicted values
*/
predict(x) {
let p = x
for (let i = 0; i < this._k; i++) {
p = this._ma(p)
}
return p
}
}