-
Notifications
You must be signed in to change notification settings - Fork 7
/
utils.ts
86 lines (74 loc) · 2.07 KB
/
utils.ts
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
export function movingAverage(arr: number[], n: number = 5): number[] {
if (arr.length - n < 0) {
return [];
}
const result = new Array<number>(arr.length - n);
for (let i = n; i < arr.length; i++) {
let meanLastN: number = 0.0;
for (let j = i - n; j < i; j++) {
meanLastN += arr[j];
}
result[i] = meanLastN / n;
}
return result;
}
export function softmax(arr: number[]): number[] {
const C = Math.max(...arr);
const d = arr.map((y) => Math.exp(y - C)).reduce((a, b) => a + b);
return arr.map((value) => {
return Math.exp(value - C) / d;
});
}
function arrMean(arr: number[]): number {
const length: number = arr.length;
if (length === 0) {
return 0.0;
}
const sum: number = arr.reduce(
(prev: number, curr: number) => prev + curr,
0
);
return sum / length;
}
function arrStd(arr: number[]): number {
const length: number = arr.length;
if (length < 2) {
return 0.0;
}
const mean: number = arrMean(arr);
const variance: number = arr.reduce(
(prev: number, curr: number) => prev + (curr - mean) ** 2,
0
);
return Math.sqrt(variance / (length - 1));
}
export function standardize(arr: number[]): number[] {
const mean = arrMean(arr);
const std = arrStd(arr);
if (std === 0) {
return arr;
}
return arr.map((val: number) => (val - mean) / std);
}
export function meanNormalize(arr: number[]): number[] {
const min: number = Math.min(...arr);
const max: number = Math.max(...arr);
const mean: number = arrMean(arr);
return arr.map((val: number) => (val - mean) / (max - min));
}
export function rmsNormalize(arr: number[], rmsLevel: number = 0.0): number[] {
const r = 10 ** (rmsLevel / 10.0);
const squaredSum = arr.reduce(
(prev: number, curr: number) => prev + curr ** 2,
0
);
const a = Math.sqrt((arr.length * r ** 2) / squaredSum);
return arr.map((val: number) => val * a || 0);
}
export function peakNormalize(arr: number[]): number[] {
const max: number = Math.max(...arr);
if (max === 0.0) {
return arr;
}
return arr.map((val: number) => val / max);
}