@seanhogg/builderforce-memory-engine 2026.9.33 → 2026.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/evermind/delta_wire.d.ts +10 -1
- package/dist/evermind/delta_wire.d.ts.map +1 -1
- package/dist/evermind/delta_wire.js +25 -3
- package/dist/evermind/delta_wire.js.map +1 -1
- package/dist/evermind/index.d.ts +4 -4
- package/dist/evermind/index.d.ts.map +1 -1
- package/dist/evermind/index.js +2 -2
- package/dist/evermind/index.js.map +1 -1
- package/dist/evermind/merge.d.ts +25 -0
- package/dist/evermind/merge.d.ts.map +1 -1
- package/dist/evermind/merge.js +30 -0
- package/dist/evermind/merge.js.map +1 -1
- package/dist/evermind/package.d.ts +9 -0
- package/dist/evermind/package.d.ts.map +1 -1
- package/dist/evermind/package.js +20 -0
- package/dist/evermind/package.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/limbic/index.d.ts +3 -0
- package/dist/limbic/index.d.ts.map +1 -1
- package/dist/limbic/index.js +3 -0
- package/dist/limbic/index.js.map +1 -1
- package/dist/limbic/limbic_task.d.ts +22 -0
- package/dist/limbic/limbic_task.d.ts.map +1 -0
- package/dist/limbic/limbic_task.js +45 -0
- package/dist/limbic/limbic_task.js.map +1 -0
- package/dist/limbic/limbic_trainer.d.ts +17 -30
- package/dist/limbic/limbic_trainer.d.ts.map +1 -1
- package/dist/limbic/limbic_trainer.js +38 -144
- package/dist/limbic/limbic_trainer.js.map +1 -1
- package/dist/ml/classical/ewma.d.ts +32 -0
- package/dist/ml/classical/ewma.d.ts.map +1 -0
- package/dist/ml/classical/ewma.js +46 -0
- package/dist/ml/classical/ewma.js.map +1 -0
- package/dist/ml/classical/gbm.d.ts +42 -0
- package/dist/ml/classical/gbm.d.ts.map +1 -0
- package/dist/ml/classical/gbm.js +116 -0
- package/dist/ml/classical/gbm.js.map +1 -0
- package/dist/ml/classical/index.d.ts +48 -0
- package/dist/ml/classical/index.d.ts.map +1 -0
- package/dist/ml/classical/index.js +45 -0
- package/dist/ml/classical/index.js.map +1 -0
- package/dist/ml/classical/isolation_forest.d.ts +37 -0
- package/dist/ml/classical/isolation_forest.d.ts.map +1 -0
- package/dist/ml/classical/isolation_forest.js +72 -0
- package/dist/ml/classical/isolation_forest.js.map +1 -0
- package/dist/ml/classical/kmeans.d.ts +31 -0
- package/dist/ml/classical/kmeans.d.ts.map +1 -0
- package/dist/ml/classical/kmeans.js +93 -0
- package/dist/ml/classical/kmeans.js.map +1 -0
- package/dist/ml/classical/knn.d.ts +48 -0
- package/dist/ml/classical/knn.d.ts.map +1 -0
- package/dist/ml/classical/knn.js +68 -0
- package/dist/ml/classical/knn.js.map +1 -0
- package/dist/ml/classical/linear.d.ts +29 -0
- package/dist/ml/classical/linear.d.ts.map +1 -0
- package/dist/ml/classical/linear.js +114 -0
- package/dist/ml/classical/linear.js.map +1 -0
- package/dist/ml/classical/logistic.d.ts +39 -0
- package/dist/ml/classical/logistic.d.ts.map +1 -0
- package/dist/ml/classical/logistic.js +103 -0
- package/dist/ml/classical/logistic.js.map +1 -0
- package/dist/ml/classical/math.d.ts +26 -0
- package/dist/ml/classical/math.d.ts.map +1 -0
- package/dist/ml/classical/math.js +90 -0
- package/dist/ml/classical/math.js.map +1 -0
- package/dist/ml/classical/naive_bayes.d.ts +24 -0
- package/dist/ml/classical/naive_bayes.d.ts.map +1 -0
- package/dist/ml/classical/naive_bayes.js +67 -0
- package/dist/ml/classical/naive_bayes.js.map +1 -0
- package/dist/ml/classical/robust_z.d.ts +30 -0
- package/dist/ml/classical/robust_z.d.ts.map +1 -0
- package/dist/ml/classical/robust_z.js +46 -0
- package/dist/ml/classical/robust_z.js.map +1 -0
- package/dist/ml/dense_head.d.ts +33 -0
- package/dist/ml/dense_head.d.ts.map +1 -0
- package/dist/ml/dense_head.js +140 -0
- package/dist/ml/dense_head.js.map +1 -0
- package/dist/ml/features.d.ts +25 -0
- package/dist/ml/features.d.ts.map +1 -0
- package/dist/ml/features.js +46 -0
- package/dist/ml/features.js.map +1 -0
- package/dist/ml/federate.d.ts +70 -0
- package/dist/ml/federate.d.ts.map +1 -0
- package/dist/ml/federate.js +122 -0
- package/dist/ml/federate.js.map +1 -0
- package/dist/ml/head_trainer.d.ts +76 -0
- package/dist/ml/head_trainer.d.ts.map +1 -0
- package/dist/ml/head_trainer.js +182 -0
- package/dist/ml/head_trainer.js.map +1 -0
- package/dist/ml/index.d.ts +23 -0
- package/dist/ml/index.d.ts.map +1 -0
- package/dist/ml/index.js +11 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ml/registry.d.ts +20 -0
- package/dist/ml/registry.d.ts.map +1 -0
- package/dist/ml/registry.js +43 -0
- package/dist/ml/registry.js.map +1 -0
- package/dist/ml/run.d.ts +94 -0
- package/dist/ml/run.d.ts.map +1 -0
- package/dist/ml/run.js +130 -0
- package/dist/ml/run.js.map +1 -0
- package/dist/ml/tasks/experience.d.ts +90 -0
- package/dist/ml/tasks/experience.d.ts.map +1 -0
- package/dist/ml/tasks/experience.js +156 -0
- package/dist/ml/tasks/experience.js.map +1 -0
- package/dist/ml/tasks/index.d.ts +10 -0
- package/dist/ml/tasks/index.d.ts.map +1 -0
- package/dist/ml/tasks/index.js +28 -0
- package/dist/ml/tasks/index.js.map +1 -0
- package/dist/ml/tasks/local_success.d.ts +55 -0
- package/dist/ml/tasks/local_success.d.ts.map +1 -0
- package/dist/ml/tasks/local_success.js +77 -0
- package/dist/ml/tasks/local_success.js.map +1 -0
- package/dist/ml/tasks/run_anomaly.d.ts +51 -0
- package/dist/ml/tasks/run_anomaly.d.ts.map +1 -0
- package/dist/ml/tasks/run_anomaly.js +60 -0
- package/dist/ml/tasks/run_anomaly.js.map +1 -0
- package/dist/ml/train.d.ts +64 -0
- package/dist/ml/train.d.ts.map +1 -0
- package/dist/ml/train.js +101 -0
- package/dist/ml/train.js.map +1 -0
- package/dist/ml/types.d.ts +112 -0
- package/dist/ml/types.d.ts.map +1 -0
- package/dist/ml/types.js +23 -0
- package/dist/ml/types.js.map +1 -0
- package/dist/moe/moe_model.d.ts.map +1 -1
- package/dist/moe/moe_model.js +1 -16
- package/dist/moe/moe_model.js.map +1 -1
- package/dist/training/cpu_ops.d.ts +2 -0
- package/dist/training/cpu_ops.d.ts.map +1 -1
- package/dist/training/cpu_ops.js +16 -0
- package/dist/training/cpu_ops.js.map +1 -1
- package/package.json +1 -1
- package/src/evermind/delta_wire.ts +148 -114
- package/src/evermind/index.ts +35 -32
- package/src/evermind/merge.ts +53 -0
- package/src/evermind/package.ts +488 -464
- package/src/index.ts +15 -1
- package/src/limbic/index.ts +5 -0
- package/src/limbic/limbic_task.ts +62 -0
- package/src/limbic/limbic_trainer.ts +91 -258
- package/src/ml/classical/ewma.ts +68 -0
- package/src/ml/classical/gbm.ts +143 -0
- package/src/ml/classical/index.ts +76 -0
- package/src/ml/classical/isolation_forest.ts +88 -0
- package/src/ml/classical/kmeans.ts +102 -0
- package/src/ml/classical/knn.ts +98 -0
- package/src/ml/classical/linear.ts +119 -0
- package/src/ml/classical/logistic.ts +125 -0
- package/src/ml/classical/math.ts +93 -0
- package/src/ml/classical/naive_bayes.ts +77 -0
- package/src/ml/classical/robust_z.ts +65 -0
- package/src/ml/dense_head.ts +157 -0
- package/src/ml/features.ts +61 -0
- package/src/ml/federate.ts +160 -0
- package/src/ml/head_trainer.ts +268 -0
- package/src/ml/index.ts +57 -0
- package/src/ml/registry.ts +44 -0
- package/src/ml/run.ts +178 -0
- package/src/ml/tasks/experience.ts +214 -0
- package/src/ml/tasks/index.ts +30 -0
- package/src/ml/tasks/local_success.ts +118 -0
- package/src/ml/tasks/run_anomaly.ts +90 -0
- package/src/ml/train.ts +136 -0
- package/src/ml/types.ts +132 -0
- package/src/moe/moe_model.ts +1 -13
- package/src/training/cpu_ops.ts +141 -127
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/linear.ts — ridge linear regression, closed form.
|
|
3
|
+
*
|
|
4
|
+
* Solves (XᵀWX + λI)w = XᵀWy with an unpenalised intercept by Gaussian
|
|
5
|
+
* elimination with partial pivoting. Small dims only (the catalog's numeric
|
|
6
|
+
* tasks), which is exactly where a closed form beats iterating.
|
|
7
|
+
*/
|
|
8
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
9
|
+
export interface LinearOptions {
|
|
10
|
+
/** L2 penalty on weights (not the intercept). Default 1e-6. */
|
|
11
|
+
l2?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class LinearModel implements MlPredictor {
|
|
14
|
+
readonly weights: Float32Array;
|
|
15
|
+
intercept: number;
|
|
16
|
+
/** Coefficient of determination on the fitted data, clamped to [0, 1]. */
|
|
17
|
+
readonly r2: number;
|
|
18
|
+
constructor(weights: Float32Array, intercept: number,
|
|
19
|
+
/** Coefficient of determination on the fitted data, clamped to [0, 1]. */
|
|
20
|
+
r2: number);
|
|
21
|
+
value(x: ArrayLike<number>): number;
|
|
22
|
+
predict(x: Float32Array): MlPrediction;
|
|
23
|
+
exportParams(): Float32Array;
|
|
24
|
+
importParams(params: ArrayLike<number>): void;
|
|
25
|
+
}
|
|
26
|
+
/** Solve A·x = b in place (A is n×n row-major). Throws when singular. */
|
|
27
|
+
export declare function solveLinearSystem(A: Float64Array, b: Float64Array, n: number): Float64Array;
|
|
28
|
+
export declare function fitLinear(samples: readonly MlSample[], opts?: LinearOptions): LinearModel;
|
|
29
|
+
//# sourceMappingURL=linear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/linear.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,WAAY,YAAW,WAAW;IAE3C,QAAQ,CAAC,OAAO,EAAE,YAAY;IACvB,SAAS,EAAE,MAAM;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM;gBAHV,OAAO,EAAE,YAAY,EACvB,SAAS,EAAE,MAAM;IACxB,0EAA0E;IACjE,EAAE,EAAE,MAAM;IAGrB,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM;IAMnC,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;IAItC,YAAY,IAAI,YAAY;IAO5B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;CAO9C;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CA6B3F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,WAAW,CAqC7F"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { featureDim } from "./math.js";
|
|
2
|
+
export class LinearModel {
|
|
3
|
+
weights;
|
|
4
|
+
intercept;
|
|
5
|
+
r2;
|
|
6
|
+
constructor(weights, intercept,
|
|
7
|
+
/** Coefficient of determination on the fitted data, clamped to [0, 1]. */
|
|
8
|
+
r2) {
|
|
9
|
+
this.weights = weights;
|
|
10
|
+
this.intercept = intercept;
|
|
11
|
+
this.r2 = r2;
|
|
12
|
+
}
|
|
13
|
+
value(x) {
|
|
14
|
+
let s = this.intercept;
|
|
15
|
+
for (let i = 0; i < this.weights.length; i++)
|
|
16
|
+
s += this.weights[i] * (x[i] ?? 0);
|
|
17
|
+
return s;
|
|
18
|
+
}
|
|
19
|
+
predict(x) {
|
|
20
|
+
return { scores: [this.value(x)], confidence: this.r2 };
|
|
21
|
+
}
|
|
22
|
+
exportParams() {
|
|
23
|
+
const out = new Float32Array(this.weights.length + 1);
|
|
24
|
+
out.set(this.weights, 0);
|
|
25
|
+
out[this.weights.length] = this.intercept;
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
importParams(params) {
|
|
29
|
+
if (params.length !== this.weights.length + 1) {
|
|
30
|
+
throw new Error(`LinearModel.importParams: expected ${this.weights.length + 1} values, got ${params.length}`);
|
|
31
|
+
}
|
|
32
|
+
for (let i = 0; i < this.weights.length; i++)
|
|
33
|
+
this.weights[i] = params[i];
|
|
34
|
+
this.intercept = params[this.weights.length];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Solve A·x = b in place (A is n×n row-major). Throws when singular. */
|
|
38
|
+
export function solveLinearSystem(A, b, n) {
|
|
39
|
+
for (let col = 0; col < n; col++) {
|
|
40
|
+
let piv = col;
|
|
41
|
+
for (let r = col + 1; r < n; r++)
|
|
42
|
+
if (Math.abs(A[r * n + col]) > Math.abs(A[piv * n + col]))
|
|
43
|
+
piv = r;
|
|
44
|
+
if (Math.abs(A[piv * n + col]) < 1e-12)
|
|
45
|
+
throw new Error("solveLinearSystem: singular matrix");
|
|
46
|
+
if (piv !== col) {
|
|
47
|
+
for (let c = 0; c < n; c++) {
|
|
48
|
+
const t = A[col * n + c];
|
|
49
|
+
A[col * n + c] = A[piv * n + c];
|
|
50
|
+
A[piv * n + c] = t;
|
|
51
|
+
}
|
|
52
|
+
const t = b[col];
|
|
53
|
+
b[col] = b[piv];
|
|
54
|
+
b[piv] = t;
|
|
55
|
+
}
|
|
56
|
+
for (let r = col + 1; r < n; r++) {
|
|
57
|
+
const f = A[r * n + col] / A[col * n + col];
|
|
58
|
+
if (f === 0)
|
|
59
|
+
continue;
|
|
60
|
+
for (let c = col; c < n; c++)
|
|
61
|
+
A[r * n + c] = A[r * n + c] - f * A[col * n + c];
|
|
62
|
+
b[r] = b[r] - f * b[col];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const x = new Float64Array(n);
|
|
66
|
+
for (let r = n - 1; r >= 0; r--) {
|
|
67
|
+
let s = b[r];
|
|
68
|
+
for (let c = r + 1; c < n; c++)
|
|
69
|
+
s -= A[r * n + c] * x[c];
|
|
70
|
+
x[r] = s / A[r * n + r];
|
|
71
|
+
}
|
|
72
|
+
return x;
|
|
73
|
+
}
|
|
74
|
+
export function fitLinear(samples, opts = {}) {
|
|
75
|
+
const d = featureDim(samples.map((s) => s.x));
|
|
76
|
+
const n = d + 1; // last column = intercept
|
|
77
|
+
const A = new Float64Array(n * n);
|
|
78
|
+
const b = new Float64Array(n);
|
|
79
|
+
const row = new Float64Array(n);
|
|
80
|
+
for (const s of samples) {
|
|
81
|
+
const w = s.weight ?? 1;
|
|
82
|
+
for (let i = 0; i < d; i++)
|
|
83
|
+
row[i] = s.x[i];
|
|
84
|
+
row[d] = 1;
|
|
85
|
+
for (let i = 0; i < n; i++) {
|
|
86
|
+
b[i] = b[i] + w * row[i] * s.y;
|
|
87
|
+
for (let j = 0; j < n; j++)
|
|
88
|
+
A[i * n + j] = A[i * n + j] + w * row[i] * row[j];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const l2 = opts.l2 ?? 1e-6;
|
|
92
|
+
for (let i = 0; i < d; i++)
|
|
93
|
+
A[i * n + i] = A[i * n + i] + l2;
|
|
94
|
+
const sol = solveLinearSystem(A, b, n);
|
|
95
|
+
const model = new LinearModel(Float32Array.from(sol.subarray(0, d)), sol[d], 0);
|
|
96
|
+
// R² on the fitted data — the confidence the runner reports.
|
|
97
|
+
let wSum = 0;
|
|
98
|
+
let mean = 0;
|
|
99
|
+
for (const s of samples) {
|
|
100
|
+
wSum += s.weight ?? 1;
|
|
101
|
+
mean += (s.weight ?? 1) * s.y;
|
|
102
|
+
}
|
|
103
|
+
mean /= wSum;
|
|
104
|
+
let ssRes = 0;
|
|
105
|
+
let ssTot = 0;
|
|
106
|
+
for (const s of samples) {
|
|
107
|
+
const w = s.weight ?? 1;
|
|
108
|
+
ssRes += w * (s.y - model.value(s.x)) ** 2;
|
|
109
|
+
ssTot += w * (s.y - mean) ** 2;
|
|
110
|
+
}
|
|
111
|
+
const r2 = ssTot > 0 ? Math.min(1, Math.max(0, 1 - ssRes / ssTot)) : ssRes < 1e-12 ? 1 : 0;
|
|
112
|
+
return new LinearModel(model.weights, model.intercept, r2);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/ml/classical/linear.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAOvC,MAAM,OAAO,WAAW;IAEX;IACF;IAEE;IAJX,YACW,OAAqB,EACvB,SAAiB;IACxB,0EAA0E;IACjE,EAAU;QAHV,YAAO,GAAP,OAAO,CAAc;QACvB,cAAS,GAAT,SAAS,CAAQ;QAEf,OAAE,GAAF,EAAE,CAAQ;IAClB,CAAC;IAEJ,KAAK,CAAC,CAAoB;QACxB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,CAAe;QACrB,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,CAAC,MAAyB;QACpC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAC3E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC;IAChD,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,CAAe,EAAE,CAAe,EAAE,CAAS;IAC3E,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjC,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAE,CAAC;gBAAE,GAAG,GAAG,CAAC,CAAC;QACvG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAE,CAAC,GAAG,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/F,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;gBAC1B,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;gBACjC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAE,CAAC;YAClB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAE,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtB,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;YACjF,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC3D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAA4B,EAAE,OAAsB,EAAE;IAC9E,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B;IAC3C,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACnF,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;IAEjF,6DAA6D;IAC7D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/logistic.ts — (multinomial) logistic regression.
|
|
3
|
+
*
|
|
4
|
+
* Softmax regression with L2, fitted by full-batch gradient descent; two classes
|
|
5
|
+
* is ordinary logistic regression. No internal feature scaling: a task supplies
|
|
6
|
+
* features on a stable scale, so a weight means the same thing on every machine —
|
|
7
|
+
* which is what lets trained weights FEDERATE (`exportParams` / `importParams`).
|
|
8
|
+
*/
|
|
9
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
10
|
+
export interface LogisticOptions {
|
|
11
|
+
classes?: number;
|
|
12
|
+
learningRate?: number;
|
|
13
|
+
epochs?: number;
|
|
14
|
+
/** L2 penalty on weights (not biases). Default 1e-3. */
|
|
15
|
+
l2?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class LogisticModel implements MlPredictor {
|
|
18
|
+
readonly dim: number;
|
|
19
|
+
readonly classes: number;
|
|
20
|
+
/** Row-major weights [classes × dim]. */
|
|
21
|
+
readonly weights: Float32Array;
|
|
22
|
+
readonly bias: Float32Array;
|
|
23
|
+
constructor(dim: number, classes: number);
|
|
24
|
+
logits(x: ArrayLike<number>): number[];
|
|
25
|
+
proba(x: ArrayLike<number>): number[];
|
|
26
|
+
predict(x: Float32Array): MlPrediction;
|
|
27
|
+
/** Weighted mean cross-entropy over `samples` (the eval-gate loss). */
|
|
28
|
+
loss(samples: readonly MlSample[]): number;
|
|
29
|
+
/** One full-batch gradient step; returns the pre-step mean loss. */
|
|
30
|
+
step(samples: readonly MlSample[], learningRate: number, l2: number): number;
|
|
31
|
+
exportParams(): Float32Array;
|
|
32
|
+
importParams(params: ArrayLike<number>): void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fit logistic regression. Pass `init` to continue from existing weights (a local
|
|
36
|
+
* round on top of a merged federated head).
|
|
37
|
+
*/
|
|
38
|
+
export declare function fitLogistic(samples: readonly MlSample[], opts?: LogisticOptions, init?: LogisticModel): LogisticModel;
|
|
39
|
+
//# sourceMappingURL=logistic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logistic.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/logistic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,aAAc,YAAW,WAAW;IAM7C,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM;IAN1B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;gBAGjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM;IAM1B,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAWtC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAIrC,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;IAKtC,uEAAuE;IACvE,IAAI,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM;IAW1C,oEAAoE;IACpE,IAAI,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAyB5E,YAAY,IAAI,YAAY;IAO5B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;CAO9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,QAAQ,EAAE,EAC5B,IAAI,GAAE,eAAoB,EAC1B,IAAI,CAAC,EAAE,aAAa,GACnB,aAAa,CAUf"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { classCount, featureDim, softmax, topProbability } from "./math.js";
|
|
2
|
+
export class LogisticModel {
|
|
3
|
+
dim;
|
|
4
|
+
classes;
|
|
5
|
+
/** Row-major weights [classes × dim]. */
|
|
6
|
+
weights;
|
|
7
|
+
bias;
|
|
8
|
+
constructor(dim, classes) {
|
|
9
|
+
this.dim = dim;
|
|
10
|
+
this.classes = classes;
|
|
11
|
+
this.weights = new Float32Array(classes * dim);
|
|
12
|
+
this.bias = new Float32Array(classes);
|
|
13
|
+
}
|
|
14
|
+
logits(x) {
|
|
15
|
+
const z = [];
|
|
16
|
+
for (let c = 0; c < this.classes; c++) {
|
|
17
|
+
let s = this.bias[c];
|
|
18
|
+
const off = c * this.dim;
|
|
19
|
+
for (let i = 0; i < this.dim; i++)
|
|
20
|
+
s += this.weights[off + i] * (x[i] ?? 0);
|
|
21
|
+
z.push(s);
|
|
22
|
+
}
|
|
23
|
+
return z;
|
|
24
|
+
}
|
|
25
|
+
proba(x) {
|
|
26
|
+
return Array.from(softmax(this.logits(x)));
|
|
27
|
+
}
|
|
28
|
+
predict(x) {
|
|
29
|
+
const scores = this.proba(x);
|
|
30
|
+
return { scores, confidence: topProbability(scores) };
|
|
31
|
+
}
|
|
32
|
+
/** Weighted mean cross-entropy over `samples` (the eval-gate loss). */
|
|
33
|
+
loss(samples) {
|
|
34
|
+
let sum = 0;
|
|
35
|
+
let wSum = 0;
|
|
36
|
+
for (const s of samples) {
|
|
37
|
+
const w = s.weight ?? 1;
|
|
38
|
+
sum += -w * Math.log(Math.max(this.proba(s.x)[s.y] ?? 0, 1e-12));
|
|
39
|
+
wSum += w;
|
|
40
|
+
}
|
|
41
|
+
return wSum > 0 ? sum / wSum : 0;
|
|
42
|
+
}
|
|
43
|
+
/** One full-batch gradient step; returns the pre-step mean loss. */
|
|
44
|
+
step(samples, learningRate, l2) {
|
|
45
|
+
const gW = new Float64Array(this.weights.length);
|
|
46
|
+
const gB = new Float64Array(this.classes);
|
|
47
|
+
let loss = 0;
|
|
48
|
+
let wSum = 0;
|
|
49
|
+
for (const s of samples) {
|
|
50
|
+
const w = s.weight ?? 1;
|
|
51
|
+
const p = this.proba(s.x);
|
|
52
|
+
loss += -w * Math.log(Math.max(p[s.y], 1e-12));
|
|
53
|
+
wSum += w;
|
|
54
|
+
for (let c = 0; c < this.classes; c++) {
|
|
55
|
+
const g = w * (p[c] - (c === s.y ? 1 : 0));
|
|
56
|
+
gB[c] = gB[c] + g;
|
|
57
|
+
const off = c * this.dim;
|
|
58
|
+
for (let i = 0; i < this.dim; i++)
|
|
59
|
+
gW[off + i] = gW[off + i] + g * s.x[i];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const inv = wSum > 0 ? 1 / wSum : 0;
|
|
63
|
+
for (let j = 0; j < this.weights.length; j++) {
|
|
64
|
+
this.weights[j] = this.weights[j] - learningRate * (gW[j] * inv + l2 * this.weights[j]);
|
|
65
|
+
}
|
|
66
|
+
for (let c = 0; c < this.classes; c++)
|
|
67
|
+
this.bias[c] = this.bias[c] - learningRate * gB[c] * inv;
|
|
68
|
+
return loss * inv;
|
|
69
|
+
}
|
|
70
|
+
exportParams() {
|
|
71
|
+
const out = new Float32Array(this.weights.length + this.bias.length);
|
|
72
|
+
out.set(this.weights, 0);
|
|
73
|
+
out.set(this.bias, this.weights.length);
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
importParams(params) {
|
|
77
|
+
if (params.length !== this.weights.length + this.bias.length) {
|
|
78
|
+
throw new Error(`LogisticModel.importParams: expected ${this.weights.length + this.bias.length} values, got ${params.length}`);
|
|
79
|
+
}
|
|
80
|
+
for (let j = 0; j < this.weights.length; j++)
|
|
81
|
+
this.weights[j] = params[j];
|
|
82
|
+
for (let c = 0; c < this.bias.length; c++)
|
|
83
|
+
this.bias[c] = params[this.weights.length + c];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fit logistic regression. Pass `init` to continue from existing weights (a local
|
|
88
|
+
* round on top of a merged federated head).
|
|
89
|
+
*/
|
|
90
|
+
export function fitLogistic(samples, opts = {}, init) {
|
|
91
|
+
const d = featureDim(samples.map((s) => s.x));
|
|
92
|
+
const k = opts.classes ?? init?.classes ?? classCount(samples.map((s) => s.y));
|
|
93
|
+
const model = init ?? new LogisticModel(d, k);
|
|
94
|
+
if (model.dim !== d || model.classes !== k)
|
|
95
|
+
throw new Error(`fitLogistic: init is ${model.dim}×${model.classes}, data is ${d}×${k}`);
|
|
96
|
+
const lr = opts.learningRate ?? 0.5;
|
|
97
|
+
const l2 = opts.l2 ?? 1e-3;
|
|
98
|
+
const epochs = opts.epochs ?? 300;
|
|
99
|
+
for (let e = 0; e < epochs; e++)
|
|
100
|
+
model.step(samples, lr, l2);
|
|
101
|
+
return model;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=logistic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logistic.js","sourceRoot":"","sources":["../../../src/ml/classical/logistic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** The engine's ONE sigmoid / softmax (`training/cpu_ops.ts`). */
|
|
2
|
+
export { sigmoid, softmax } from "../../training/cpu_ops.js";
|
|
3
|
+
export type Vec = ArrayLike<number>;
|
|
4
|
+
export declare function dot(a: Vec, b: Vec): number;
|
|
5
|
+
export declare function norm(a: Vec): number;
|
|
6
|
+
/** Cosine similarity in [-1, 1]; 0 when either vector is zero. */
|
|
7
|
+
export declare function cosine(a: Vec, b: Vec): number;
|
|
8
|
+
export declare function squaredDistance(a: Vec, b: Vec): number;
|
|
9
|
+
/** Median of a numeric list (copy-sorted). NaN for an empty list. */
|
|
10
|
+
export declare function median(values: readonly number[]): number;
|
|
11
|
+
/** Index of the largest value (first on ties). */
|
|
12
|
+
export declare function argmax(values: ArrayLike<number>): number;
|
|
13
|
+
/** Number of distinct classes implied by integer labels 0..k-1. */
|
|
14
|
+
export declare function classCount(labels: readonly number[]): number;
|
|
15
|
+
/** Feature dimension of a non-empty sample matrix; throws on ragged rows. */
|
|
16
|
+
export declare function featureDim(X: readonly Vec[]): number;
|
|
17
|
+
/** Confidence of a probability vector: its top probability. */
|
|
18
|
+
export declare function topProbability(p: readonly number[]): number;
|
|
19
|
+
/** A deterministic [0,1) source for algorithms that sample — the engine's ONE seeded RNG. */
|
|
20
|
+
export declare function seededUniform(seed: number): () => number;
|
|
21
|
+
/**
|
|
22
|
+
* Average path length of an unsuccessful BST search over n points — the
|
|
23
|
+
* isolation-forest normaliser c(n).
|
|
24
|
+
*/
|
|
25
|
+
export declare function averagePathLength(n: number): number;
|
|
26
|
+
//# sourceMappingURL=math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/math.ts"],"names":[],"mappings":"AAMA,kEAAkE;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEpC,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAK1C;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAEnC;AAED,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAI7C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAQtD;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAKxD;AAED,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAIxD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAO5D;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,GAAG,MAAM,CAKpD;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE3D;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/math.ts — the small vector helpers every classical algorithm shares.
|
|
3
|
+
* Pure, allocation-light, deterministic.
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRng } from "../../utils/rng.js";
|
|
6
|
+
/** The engine's ONE sigmoid / softmax (`training/cpu_ops.ts`). */
|
|
7
|
+
export { sigmoid, softmax } from "../../training/cpu_ops.js";
|
|
8
|
+
export function dot(a, b) {
|
|
9
|
+
const n = Math.min(a.length, b.length);
|
|
10
|
+
let s = 0;
|
|
11
|
+
for (let i = 0; i < n; i++)
|
|
12
|
+
s += a[i] * b[i];
|
|
13
|
+
return s;
|
|
14
|
+
}
|
|
15
|
+
export function norm(a) {
|
|
16
|
+
return Math.sqrt(dot(a, a));
|
|
17
|
+
}
|
|
18
|
+
/** Cosine similarity in [-1, 1]; 0 when either vector is zero. */
|
|
19
|
+
export function cosine(a, b) {
|
|
20
|
+
const na = norm(a);
|
|
21
|
+
const nb = norm(b);
|
|
22
|
+
return na > 0 && nb > 0 ? dot(a, b) / (na * nb) : 0;
|
|
23
|
+
}
|
|
24
|
+
export function squaredDistance(a, b) {
|
|
25
|
+
const n = Math.min(a.length, b.length);
|
|
26
|
+
let s = 0;
|
|
27
|
+
for (let i = 0; i < n; i++) {
|
|
28
|
+
const d = a[i] - b[i];
|
|
29
|
+
s += d * d;
|
|
30
|
+
}
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
/** Median of a numeric list (copy-sorted). NaN for an empty list. */
|
|
34
|
+
export function median(values) {
|
|
35
|
+
if (values.length === 0)
|
|
36
|
+
return Number.NaN;
|
|
37
|
+
const s = [...values].sort((a, b) => a - b);
|
|
38
|
+
const m = s.length >> 1;
|
|
39
|
+
return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
|
|
40
|
+
}
|
|
41
|
+
/** Index of the largest value (first on ties). */
|
|
42
|
+
export function argmax(values) {
|
|
43
|
+
let best = 0;
|
|
44
|
+
for (let i = 1; i < values.length; i++)
|
|
45
|
+
if (values[i] > values[best])
|
|
46
|
+
best = i;
|
|
47
|
+
return best;
|
|
48
|
+
}
|
|
49
|
+
/** Number of distinct classes implied by integer labels 0..k-1. */
|
|
50
|
+
export function classCount(labels) {
|
|
51
|
+
let k = 0;
|
|
52
|
+
for (const y of labels) {
|
|
53
|
+
if (!Number.isInteger(y) || y < 0)
|
|
54
|
+
throw new Error(`class label must be a non-negative integer, got ${y}`);
|
|
55
|
+
k = Math.max(k, y + 1);
|
|
56
|
+
}
|
|
57
|
+
return Math.max(k, 2);
|
|
58
|
+
}
|
|
59
|
+
/** Feature dimension of a non-empty sample matrix; throws on ragged rows. */
|
|
60
|
+
export function featureDim(X) {
|
|
61
|
+
if (X.length === 0)
|
|
62
|
+
throw new Error("no samples");
|
|
63
|
+
const d = X[0].length;
|
|
64
|
+
for (const x of X)
|
|
65
|
+
if (x.length !== d)
|
|
66
|
+
throw new Error(`ragged features: expected ${d}, got ${x.length}`);
|
|
67
|
+
return d;
|
|
68
|
+
}
|
|
69
|
+
/** Confidence of a probability vector: its top probability. */
|
|
70
|
+
export function topProbability(p) {
|
|
71
|
+
return p.length ? Math.max(...p) : 0;
|
|
72
|
+
}
|
|
73
|
+
/** A deterministic [0,1) source for algorithms that sample — the engine's ONE seeded RNG. */
|
|
74
|
+
export function seededUniform(seed) {
|
|
75
|
+
const rng = new SeededRng(seed);
|
|
76
|
+
return () => rng.next();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Average path length of an unsuccessful BST search over n points — the
|
|
80
|
+
* isolation-forest normaliser c(n).
|
|
81
|
+
*/
|
|
82
|
+
export function averagePathLength(n) {
|
|
83
|
+
if (n <= 1)
|
|
84
|
+
return 0;
|
|
85
|
+
if (n === 2)
|
|
86
|
+
return 1;
|
|
87
|
+
const harmonic = Math.log(n - 1) + 0.5772156649;
|
|
88
|
+
return 2 * harmonic - (2 * (n - 1)) / n;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/ml/classical/math.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,kEAAkE;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,UAAU,GAAG,CAAC,CAAM,EAAE,CAAM;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAM;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,MAAM,CAAC,CAAM,EAAE,CAAM;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAM,EAAE,CAAM;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACxB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,MAAM,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,IAAI,CAAE;YAAE,IAAI,GAAG,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,CAAiB;IAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,CAAoB;IACjD,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;IAChD,OAAO,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/naive_bayes.ts — Gaussian naive Bayes.
|
|
3
|
+
*
|
|
4
|
+
* Per class: a weighted prior, and an independent Gaussian per feature. Variance
|
|
5
|
+
* is smoothed by a fraction of the largest feature variance (as scikit-learn's
|
|
6
|
+
* `var_smoothing`), so a constant feature never divides by zero.
|
|
7
|
+
*/
|
|
8
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
9
|
+
export interface NaiveBayesOptions {
|
|
10
|
+
classes?: number;
|
|
11
|
+
/** Fraction of the largest feature variance added to every variance. Default 1e-9. */
|
|
12
|
+
varSmoothing?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class NaiveBayesModel implements MlPredictor {
|
|
15
|
+
readonly logPrior: Float64Array;
|
|
16
|
+
readonly mean: Float64Array[];
|
|
17
|
+
readonly variance: Float64Array[];
|
|
18
|
+
constructor(logPrior: Float64Array, mean: Float64Array[], variance: Float64Array[]);
|
|
19
|
+
/** Per-class joint log-likelihood log P(c) + Σ log N(x_i | μ, σ²). */
|
|
20
|
+
jointLogLikelihood(x: ArrayLike<number>): number[];
|
|
21
|
+
predict(x: Float32Array): MlPrediction;
|
|
22
|
+
}
|
|
23
|
+
export declare function fitNaiveBayes(samples: readonly MlSample[], opts?: NaiveBayesOptions): NaiveBayesModel;
|
|
24
|
+
//# sourceMappingURL=naive_bayes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/naive_bayes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAgB,YAAW,WAAW;IAE/C,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE;IAC7B,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE;gBAFxB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,YAAY,EAAE,EACpB,QAAQ,EAAE,YAAY,EAAE;IAGnC,sEAAsE;IACtE,kBAAkB,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAYlD,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;CAIvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,iBAAsB,GAAG,eAAe,CAkCzG"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { classCount, featureDim, softmax, topProbability } from "./math.js";
|
|
2
|
+
export class NaiveBayesModel {
|
|
3
|
+
logPrior;
|
|
4
|
+
mean;
|
|
5
|
+
variance;
|
|
6
|
+
constructor(logPrior, mean, variance) {
|
|
7
|
+
this.logPrior = logPrior;
|
|
8
|
+
this.mean = mean;
|
|
9
|
+
this.variance = variance;
|
|
10
|
+
}
|
|
11
|
+
/** Per-class joint log-likelihood log P(c) + Σ log N(x_i | μ, σ²). */
|
|
12
|
+
jointLogLikelihood(x) {
|
|
13
|
+
return this.mean.map((mu, c) => {
|
|
14
|
+
const v = this.variance[c];
|
|
15
|
+
let ll = this.logPrior[c];
|
|
16
|
+
for (let i = 0; i < mu.length; i++) {
|
|
17
|
+
const d = (x[i] ?? 0) - mu[i];
|
|
18
|
+
ll += -0.5 * Math.log(2 * Math.PI * v[i]) - (d * d) / (2 * v[i]);
|
|
19
|
+
}
|
|
20
|
+
return ll;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
predict(x) {
|
|
24
|
+
const scores = Array.from(softmax(this.jointLogLikelihood(x)));
|
|
25
|
+
return { scores, confidence: topProbability(scores) };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function fitNaiveBayes(samples, opts = {}) {
|
|
29
|
+
const d = featureDim(samples.map((s) => s.x));
|
|
30
|
+
const k = opts.classes ?? classCount(samples.map((s) => s.y));
|
|
31
|
+
const wSum = new Float64Array(k);
|
|
32
|
+
const mean = Array.from({ length: k }, () => new Float64Array(d));
|
|
33
|
+
const variance = Array.from({ length: k }, () => new Float64Array(d));
|
|
34
|
+
for (const s of samples) {
|
|
35
|
+
const w = s.weight ?? 1;
|
|
36
|
+
wSum[s.y] = wSum[s.y] + w;
|
|
37
|
+
for (let i = 0; i < d; i++)
|
|
38
|
+
mean[s.y][i] = mean[s.y][i] + w * s.x[i];
|
|
39
|
+
}
|
|
40
|
+
for (let c = 0; c < k; c++)
|
|
41
|
+
if (wSum[c] > 0)
|
|
42
|
+
for (let i = 0; i < d; i++)
|
|
43
|
+
mean[c][i] = mean[c][i] / wSum[c];
|
|
44
|
+
for (const s of samples) {
|
|
45
|
+
const w = s.weight ?? 1;
|
|
46
|
+
for (let i = 0; i < d; i++) {
|
|
47
|
+
const diff = s.x[i] - mean[s.y][i];
|
|
48
|
+
variance[s.y][i] = variance[s.y][i] + w * diff * diff;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
let maxVar = 0;
|
|
52
|
+
for (let c = 0; c < k; c++) {
|
|
53
|
+
for (let i = 0; i < d; i++) {
|
|
54
|
+
variance[c][i] = wSum[c] > 0 ? variance[c][i] / wSum[c] : 0;
|
|
55
|
+
maxVar = Math.max(maxVar, variance[c][i]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const eps = (opts.varSmoothing ?? 1e-9) * Math.max(maxVar, 1e-12) + 1e-12;
|
|
59
|
+
for (let c = 0; c < k; c++)
|
|
60
|
+
for (let i = 0; i < d; i++)
|
|
61
|
+
variance[c][i] = variance[c][i] + eps;
|
|
62
|
+
const total = wSum.reduce((a, b) => a + b, 0);
|
|
63
|
+
// An unseen class keeps a vanishing (not -∞) prior so softmax stays defined.
|
|
64
|
+
const logPrior = Float64Array.from(wSum, (w) => Math.log(Math.max(w, 1e-12) / total));
|
|
65
|
+
return new NaiveBayesModel(logPrior, mean, variance);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=naive_bayes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.js","sourceRoot":"","sources":["../../../src/ml/classical/naive_bayes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/robust_z.ts — robust (median/MAD) z-scores for anomaly detection.
|
|
3
|
+
*
|
|
4
|
+
* Per feature: z = |x − median| / (1.4826 · MAD). Median and MAD are not dragged
|
|
5
|
+
* by the very outliers being looked for, unlike mean and standard deviation. When
|
|
6
|
+
* MAD is 0 (more than half the history identical) the mean absolute deviation
|
|
7
|
+
* stands in, then a floor, so a constant history still scores a change.
|
|
8
|
+
*
|
|
9
|
+
* Prediction: `scores[0] = max_i z_i / threshold` — ≥ 1 is anomalous.
|
|
10
|
+
*/
|
|
11
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
12
|
+
export interface RobustZOptions {
|
|
13
|
+
/** z at which a feature counts as anomalous. Default 3.5 (Iglewicz & Hoaglin). */
|
|
14
|
+
threshold?: number;
|
|
15
|
+
/** Smallest scale per feature, as a fraction of |median| (plus 1e-9). Default 0.01. */
|
|
16
|
+
minScaleFraction?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class RobustZModel implements MlPredictor {
|
|
19
|
+
readonly center: Float64Array;
|
|
20
|
+
readonly scale: Float64Array;
|
|
21
|
+
readonly threshold: number;
|
|
22
|
+
constructor(center: Float64Array, scale: Float64Array, threshold: number);
|
|
23
|
+
/** Per-feature robust z-scores (absolute). */
|
|
24
|
+
zScores(x: ArrayLike<number>): number[];
|
|
25
|
+
predict(x: Float32Array): MlPrediction;
|
|
26
|
+
}
|
|
27
|
+
/** Confidence of an anomaly score normalised so 1 is the threshold: distance from it, capped. */
|
|
28
|
+
export declare function anomalyConfidence(score: number): number;
|
|
29
|
+
export declare function fitRobustZ(samples: readonly MlSample[], opts?: RobustZOptions): RobustZModel;
|
|
30
|
+
//# sourceMappingURL=robust_z.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robust_z.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/robust_z.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvE,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,YAAa,YAAW,WAAW;IAE5C,QAAQ,CAAC,MAAM,EAAE,YAAY;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAFjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM;IAG5B,8CAA8C;IAC9C,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAIvC,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;CAIvC;AAED,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,cAAmB,GAAG,YAAY,CAgBhG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { featureDim, median } from "./math.js";
|
|
2
|
+
/** MAD → standard deviation for normally-distributed data. */
|
|
3
|
+
const MAD_TO_SD = 1.4826;
|
|
4
|
+
/** Mean absolute deviation → standard deviation for normally-distributed data. */
|
|
5
|
+
const MEANAD_TO_SD = 1.2533;
|
|
6
|
+
export class RobustZModel {
|
|
7
|
+
center;
|
|
8
|
+
scale;
|
|
9
|
+
threshold;
|
|
10
|
+
constructor(center, scale, threshold) {
|
|
11
|
+
this.center = center;
|
|
12
|
+
this.scale = scale;
|
|
13
|
+
this.threshold = threshold;
|
|
14
|
+
}
|
|
15
|
+
/** Per-feature robust z-scores (absolute). */
|
|
16
|
+
zScores(x) {
|
|
17
|
+
return Array.from(this.center, (c, i) => Math.abs((x[i] ?? 0) - c) / this.scale[i]);
|
|
18
|
+
}
|
|
19
|
+
predict(x) {
|
|
20
|
+
const score = Math.max(0, ...this.zScores(x)) / this.threshold;
|
|
21
|
+
return { scores: [score], confidence: anomalyConfidence(score) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Confidence of an anomaly score normalised so 1 is the threshold: distance from it, capped. */
|
|
25
|
+
export function anomalyConfidence(score) {
|
|
26
|
+
return Math.max(0, Math.min(1, Math.abs(score - 1)));
|
|
27
|
+
}
|
|
28
|
+
export function fitRobustZ(samples, opts = {}) {
|
|
29
|
+
const X = samples.map((s) => s.x);
|
|
30
|
+
const d = featureDim(X);
|
|
31
|
+
const minFrac = opts.minScaleFraction ?? 0.01;
|
|
32
|
+
const center = new Float64Array(d);
|
|
33
|
+
const scale = new Float64Array(d);
|
|
34
|
+
for (let i = 0; i < d; i++) {
|
|
35
|
+
const col = X.map((x) => x[i]);
|
|
36
|
+
const med = median(col);
|
|
37
|
+
const dev = col.map((v) => Math.abs(v - med));
|
|
38
|
+
let s = MAD_TO_SD * median(dev);
|
|
39
|
+
if (!(s > 0))
|
|
40
|
+
s = MEANAD_TO_SD * (dev.reduce((a, b) => a + b, 0) / dev.length);
|
|
41
|
+
center[i] = med;
|
|
42
|
+
scale[i] = Math.max(s, minFrac * Math.abs(med) + 1e-9);
|
|
43
|
+
}
|
|
44
|
+
return new RobustZModel(center, scale, opts.threshold ?? 3.5);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=robust_z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robust_z.js","sourceRoot":"","sources":["../../../src/ml/classical/robust_z.ts"],"names":[],"mappings":"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"}
|