/
exponential_average.js
53 lines (50 loc) · 1.03 KB
/
exponential_average.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
44
45
46
47
48
49
50
51
52
53
/**
* Exponential moving average
*/
export class ExponentialMovingAverage {
// https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87#%E6%8C%87%E6%95%B0%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87
/**
* @param {number} k Degree of weighting decrease
*/
constructor(k) {
this._k = k
}
/**
* Returns smoothed values.
*
* @param {number[]} data Training data
* @returns {number[]} Predicted values
*/
predict(data) {
const a = 2 / (this._k + 1)
const s = [data[0]]
for (let i = 1; i < data.length; i++) {
s[i] = (1 - a) * s[i - 1] + a * data[i]
}
return s
}
}
/**
* Modified moving average
*/
export class ModifiedMovingAverage {
/**
* @param {number} k Degree of weighting decrease
*/
constructor(k) {
this._k = k
}
/**
* Returns smoothed values.
*
* @param {number[]} data Training data
* @returns {number[]} Predicted values
*/
predict(data) {
const p = [data[0]]
for (let i = 1; i < data.length; i++) {
p[i] = ((this._k - 1) * p[i - 1] + data[i]) / this._k
}
return p
}
}