@danielsimonjr/mathts-functions 0.30.0 → 0.31.0
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/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +626 -119
- package/dist/ml/dbscan-knn.d.ts +52 -0
- package/dist/ml/dbscan-knn.d.ts.map +1 -0
- package/dist/ml/kde.d.ts +37 -0
- package/dist/ml/kde.d.ts.map +1 -0
- package/dist/ml/logistic-regression.d.ts +34 -0
- package/dist/ml/logistic-regression.d.ts.map +1 -0
- package/dist/ml/ols.d.ts +37 -0
- package/dist/ml/ols.d.ts.map +1 -0
- package/dist/ml/regularized-regression.d.ts +65 -0
- package/dist/ml/regularized-regression.d.ts.map +1 -0
- package/dist/stats/inference-extra.d.ts +46 -0
- package/dist/stats/inference-extra.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2750,12 +2750,12 @@ var parallelStatVariance = mathTyped4("parallelStatVariance", {
|
|
|
2750
2750
|
},
|
|
2751
2751
|
// Variadic form
|
|
2752
2752
|
"number, number": (a, b) => {
|
|
2753
|
-
const
|
|
2754
|
-
return ((a -
|
|
2753
|
+
const mean7 = (a + b) / 2;
|
|
2754
|
+
return ((a - mean7) ** 2 + (b - mean7) ** 2) / 1;
|
|
2755
2755
|
},
|
|
2756
2756
|
"number, number, number": (a, b, c) => {
|
|
2757
|
-
const
|
|
2758
|
-
return ((a -
|
|
2757
|
+
const mean7 = (a + b + c) / 3;
|
|
2758
|
+
return ((a - mean7) ** 2 + (b - mean7) ** 2 + (c - mean7) ** 2) / 2;
|
|
2759
2759
|
}
|
|
2760
2760
|
});
|
|
2761
2761
|
var parallelStatStd = mathTyped4("parallelStatStd", {
|
|
@@ -3012,10 +3012,10 @@ var parallelStatMAD = mathTyped4("parallelStatMAD", {
|
|
|
3012
3012
|
const n = data.length;
|
|
3013
3013
|
if (n === 0) return NaN;
|
|
3014
3014
|
const result = await computePool3.mean(data);
|
|
3015
|
-
const
|
|
3015
|
+
const mean7 = result.result;
|
|
3016
3016
|
let mad2 = 0;
|
|
3017
3017
|
for (let i = 0; i < n; i++) {
|
|
3018
|
-
mad2 += Math.abs(data[i] -
|
|
3018
|
+
mad2 += Math.abs(data[i] - mean7);
|
|
3019
3019
|
}
|
|
3020
3020
|
return mad2 / n;
|
|
3021
3021
|
},
|
|
@@ -8381,18 +8381,18 @@ import { computePool as computePool7 } from "@danielsimonjr/mathts-parallel";
|
|
|
8381
8381
|
var GEOMETRY_WASM_THRESHOLD = 32;
|
|
8382
8382
|
var HULL3D_WASM_THRESHOLD = 1024;
|
|
8383
8383
|
function angle2D(v1, v2) {
|
|
8384
|
-
const
|
|
8384
|
+
const dot5 = v1[0] * v2[0] + v1[1] * v2[1];
|
|
8385
8385
|
const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2);
|
|
8386
8386
|
const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2);
|
|
8387
8387
|
if (mag1 === 0 || mag2 === 0) return NaN;
|
|
8388
|
-
return Math.acos(Math.max(-1, Math.min(1,
|
|
8388
|
+
return Math.acos(Math.max(-1, Math.min(1, dot5 / (mag1 * mag2))));
|
|
8389
8389
|
}
|
|
8390
8390
|
function angle3D(v1, v2) {
|
|
8391
|
-
const
|
|
8391
|
+
const dot5 = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
|
|
8392
8392
|
const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2 + v1[2] ** 2);
|
|
8393
8393
|
const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2 + v2[2] ** 2);
|
|
8394
8394
|
if (mag1 === 0 || mag2 === 0) return NaN;
|
|
8395
|
-
return Math.acos(Math.max(-1, Math.min(1,
|
|
8395
|
+
return Math.acos(Math.max(-1, Math.min(1, dot5 / (mag1 * mag2))));
|
|
8396
8396
|
}
|
|
8397
8397
|
function cross3D(a, b) {
|
|
8398
8398
|
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
@@ -8497,14 +8497,14 @@ function reflectVector(v, normal) {
|
|
|
8497
8497
|
const mag = Math.sqrt(normal.reduce((s, c) => s + c * c, 0));
|
|
8498
8498
|
if (mag === 0) return v.slice();
|
|
8499
8499
|
const n = normal.map((c) => c / mag);
|
|
8500
|
-
const
|
|
8501
|
-
return v.map((c, i) => c - 2 *
|
|
8500
|
+
const dot5 = v.reduce((s, c, i) => s + c * n[i], 0);
|
|
8501
|
+
return v.map((c, i) => c - 2 * dot5 * n[i]);
|
|
8502
8502
|
}
|
|
8503
8503
|
function projectVector(v, onto) {
|
|
8504
|
-
const
|
|
8504
|
+
const dot5 = v.reduce((s, c, i) => s + c * onto[i], 0);
|
|
8505
8505
|
const magSq = onto.reduce((s, c) => s + c * c, 0);
|
|
8506
8506
|
if (magSq === 0) return onto.map(() => 0);
|
|
8507
|
-
const scale =
|
|
8507
|
+
const scale = dot5 / magSq;
|
|
8508
8508
|
return onto.map((c) => c * scale);
|
|
8509
8509
|
}
|
|
8510
8510
|
function distance2D(a, b) {
|
|
@@ -14162,26 +14162,26 @@ function _splitSeed(baseSeed, k) {
|
|
|
14162
14162
|
function _aggregateRanks(vectors, aggregation) {
|
|
14163
14163
|
const n = vectors[0].length;
|
|
14164
14164
|
const count2 = vectors.length;
|
|
14165
|
-
const
|
|
14165
|
+
const mean7 = new Float64Array(n);
|
|
14166
14166
|
for (const v of vectors) {
|
|
14167
|
-
for (let i = 0; i < n; i++)
|
|
14167
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
14168
14168
|
}
|
|
14169
|
-
for (let i = 0; i < n; i++)
|
|
14169
|
+
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
14170
14170
|
if (aggregation === "mean") {
|
|
14171
|
-
return { ranks:
|
|
14171
|
+
return { ranks: mean7 };
|
|
14172
14172
|
}
|
|
14173
14173
|
const std2 = new Float64Array(n);
|
|
14174
14174
|
for (const v of vectors) {
|
|
14175
14175
|
for (let i = 0; i < n; i++) {
|
|
14176
|
-
const d = v[i] -
|
|
14176
|
+
const d = v[i] - mean7[i];
|
|
14177
14177
|
std2[i] += d * d;
|
|
14178
14178
|
}
|
|
14179
14179
|
}
|
|
14180
14180
|
for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
|
|
14181
14181
|
return {
|
|
14182
|
-
ranks:
|
|
14182
|
+
ranks: mean7,
|
|
14183
14183
|
ranksPerRestart: vectors,
|
|
14184
|
-
restartStats: { mean:
|
|
14184
|
+
restartStats: { mean: mean7, std: std2 }
|
|
14185
14185
|
};
|
|
14186
14186
|
}
|
|
14187
14187
|
function _pageRankOnce(adj, d, maxIter, tol, seed) {
|
|
@@ -14314,26 +14314,26 @@ function _betweennessOnce(adj, directed, normalise, seed) {
|
|
|
14314
14314
|
function _aggregateBetweenness(vectors, aggregation) {
|
|
14315
14315
|
const n = vectors[0].length;
|
|
14316
14316
|
const count2 = vectors.length;
|
|
14317
|
-
const
|
|
14317
|
+
const mean7 = new Float64Array(n);
|
|
14318
14318
|
for (const v of vectors) {
|
|
14319
|
-
for (let i = 0; i < n; i++)
|
|
14319
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
14320
14320
|
}
|
|
14321
|
-
for (let i = 0; i < n; i++)
|
|
14321
|
+
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
14322
14322
|
if (aggregation === "mean") {
|
|
14323
|
-
return { centrality:
|
|
14323
|
+
return { centrality: mean7 };
|
|
14324
14324
|
}
|
|
14325
14325
|
const std2 = new Float64Array(n);
|
|
14326
14326
|
for (const v of vectors) {
|
|
14327
14327
|
for (let i = 0; i < n; i++) {
|
|
14328
|
-
const d = v[i] -
|
|
14328
|
+
const d = v[i] - mean7[i];
|
|
14329
14329
|
std2[i] += d * d;
|
|
14330
14330
|
}
|
|
14331
14331
|
}
|
|
14332
14332
|
for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
|
|
14333
14333
|
return {
|
|
14334
|
-
centrality:
|
|
14334
|
+
centrality: mean7,
|
|
14335
14335
|
centralityPerRestart: vectors,
|
|
14336
|
-
restartStats: { mean:
|
|
14336
|
+
restartStats: { mean: mean7, std: std2 }
|
|
14337
14337
|
};
|
|
14338
14338
|
}
|
|
14339
14339
|
async function betweennessCentrality(adj, opts) {
|
|
@@ -14397,41 +14397,41 @@ function _aggregateEigenvector(vectors, aggregation) {
|
|
|
14397
14397
|
const count2 = vectors.length;
|
|
14398
14398
|
const ref = vectors[0];
|
|
14399
14399
|
const aligned = vectors.map((v) => {
|
|
14400
|
-
let
|
|
14401
|
-
for (let i = 0; i < n; i++)
|
|
14402
|
-
if (
|
|
14400
|
+
let dot5 = 0;
|
|
14401
|
+
for (let i = 0; i < n; i++) dot5 += v[i] * ref[i];
|
|
14402
|
+
if (dot5 < 0) {
|
|
14403
14403
|
const flipped = new Float64Array(n);
|
|
14404
14404
|
for (let i = 0; i < n; i++) flipped[i] = -v[i];
|
|
14405
14405
|
return flipped;
|
|
14406
14406
|
}
|
|
14407
14407
|
return v;
|
|
14408
14408
|
});
|
|
14409
|
-
const
|
|
14409
|
+
const mean7 = new Float64Array(n);
|
|
14410
14410
|
for (const v of aligned) {
|
|
14411
|
-
for (let i = 0; i < n; i++)
|
|
14411
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
14412
14412
|
}
|
|
14413
|
-
for (let i = 0; i < n; i++)
|
|
14413
|
+
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
14414
14414
|
let norm4 = 0;
|
|
14415
|
-
for (let i = 0; i < n; i++) norm4 +=
|
|
14415
|
+
for (let i = 0; i < n; i++) norm4 += mean7[i] * mean7[i];
|
|
14416
14416
|
norm4 = Math.sqrt(norm4);
|
|
14417
14417
|
if (norm4 > 1e-15) {
|
|
14418
|
-
for (let i = 0; i < n; i++)
|
|
14418
|
+
for (let i = 0; i < n; i++) mean7[i] /= norm4;
|
|
14419
14419
|
}
|
|
14420
14420
|
if (aggregation === "mean") {
|
|
14421
|
-
return { centrality:
|
|
14421
|
+
return { centrality: mean7 };
|
|
14422
14422
|
}
|
|
14423
14423
|
const std2 = new Float64Array(n);
|
|
14424
14424
|
for (const v of aligned) {
|
|
14425
14425
|
for (let i = 0; i < n; i++) {
|
|
14426
|
-
const d = v[i] -
|
|
14426
|
+
const d = v[i] - mean7[i];
|
|
14427
14427
|
std2[i] += d * d;
|
|
14428
14428
|
}
|
|
14429
14429
|
}
|
|
14430
14430
|
for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
|
|
14431
14431
|
return {
|
|
14432
|
-
centrality:
|
|
14432
|
+
centrality: mean7,
|
|
14433
14433
|
centralityPerRestart: aligned,
|
|
14434
|
-
restartStats: { mean:
|
|
14434
|
+
restartStats: { mean: mean7, std: std2 }
|
|
14435
14435
|
};
|
|
14436
14436
|
}
|
|
14437
14437
|
async function eigenvectorCentrality(adj, opts) {
|
|
@@ -15210,7 +15210,7 @@ function hypergeometricDist(population, successes, draws) {
|
|
|
15210
15210
|
for (let i = kMin; i <= kk; i++) sum3 += pmf(i);
|
|
15211
15211
|
return Math.min(1, sum3);
|
|
15212
15212
|
};
|
|
15213
|
-
const
|
|
15213
|
+
const mean7 = N * K / M;
|
|
15214
15214
|
const variance2 = N * (K / M) * ((M - K) / M) * ((M - N) / (M - 1));
|
|
15215
15215
|
return {
|
|
15216
15216
|
pdf: pmf,
|
|
@@ -15221,7 +15221,7 @@ function hypergeometricDist(population, successes, draws) {
|
|
|
15221
15221
|
for (let k = kMin; k <= kMax; k++) if (cdf(k) >= p) return k;
|
|
15222
15222
|
return kMax;
|
|
15223
15223
|
},
|
|
15224
|
-
mean:
|
|
15224
|
+
mean: mean7,
|
|
15225
15225
|
variance: variance2,
|
|
15226
15226
|
sample: () => _discreteSample(cdf, Math.random, kMax),
|
|
15227
15227
|
sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
|
|
@@ -15243,7 +15243,7 @@ function negativeBinomialDist(r, p) {
|
|
|
15243
15243
|
if (k < 0) return 0;
|
|
15244
15244
|
return Math.min(1, _betainc(p, r, Math.floor(k) + 1));
|
|
15245
15245
|
};
|
|
15246
|
-
const
|
|
15246
|
+
const mean7 = r * (1 - p) / p;
|
|
15247
15247
|
const variance2 = r * (1 - p) / (p * p);
|
|
15248
15248
|
return {
|
|
15249
15249
|
pdf: pmf,
|
|
@@ -15258,12 +15258,12 @@ function negativeBinomialDist(r, p) {
|
|
|
15258
15258
|
}
|
|
15259
15259
|
return Infinity;
|
|
15260
15260
|
},
|
|
15261
|
-
mean:
|
|
15261
|
+
mean: mean7,
|
|
15262
15262
|
variance: variance2,
|
|
15263
|
-
sample: () => _discreteSample(cdf, Math.random, Math.ceil(
|
|
15263
|
+
sample: () => _discreteSample(cdf, Math.random, Math.ceil(mean7 + 20 * Math.sqrt(variance2) + 20)),
|
|
15264
15264
|
sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
|
|
15265
15265
|
const out = new Float64Array(count2);
|
|
15266
|
-
const cap = Math.ceil(
|
|
15266
|
+
const cap = Math.ceil(mean7 + 20 * Math.sqrt(variance2) + 20);
|
|
15267
15267
|
for (let j = 0; j < count2; j++) out[j] = _discreteSample(cdf, rng, cap);
|
|
15268
15268
|
return out;
|
|
15269
15269
|
})
|
|
@@ -15442,8 +15442,8 @@ function _cholesky(m) {
|
|
|
15442
15442
|
}
|
|
15443
15443
|
return L;
|
|
15444
15444
|
}
|
|
15445
|
-
function multivariateNormal(
|
|
15446
|
-
const k =
|
|
15445
|
+
function multivariateNormal(mean7, cov2) {
|
|
15446
|
+
const k = mean7.length;
|
|
15447
15447
|
if (cov2.length !== k || cov2.some((row2) => row2.length !== k)) {
|
|
15448
15448
|
throw new Error("multivariateNormal: cov must be a k\xD7k matrix matching mean");
|
|
15449
15449
|
}
|
|
@@ -15451,13 +15451,13 @@ function multivariateNormal(mean6, cov2) {
|
|
|
15451
15451
|
let logDet = 0;
|
|
15452
15452
|
for (let i = 0; i < k; i++) logDet += 2 * Math.log(L[i][i]);
|
|
15453
15453
|
return {
|
|
15454
|
-
mean:
|
|
15454
|
+
mean: mean7,
|
|
15455
15455
|
cov: cov2,
|
|
15456
15456
|
pdf: (x) => {
|
|
15457
15457
|
if (x.length !== k) throw new Error("multivariateNormal.pdf: x must have length k");
|
|
15458
15458
|
const z = new Array(k).fill(0);
|
|
15459
15459
|
for (let i = 0; i < k; i++) {
|
|
15460
|
-
let s = x[i] -
|
|
15460
|
+
let s = x[i] - mean7[i];
|
|
15461
15461
|
for (let j = 0; j < i; j++) s -= L[i][j] * z[j];
|
|
15462
15462
|
z[i] = s / L[i][i];
|
|
15463
15463
|
}
|
|
@@ -15522,11 +15522,11 @@ function _bootstrapSummary(stats) {
|
|
|
15522
15522
|
if (n === 0) return { bootstrapMean: NaN, bootstrapStd: NaN };
|
|
15523
15523
|
let sum3 = 0;
|
|
15524
15524
|
for (let i = 0; i < n; i++) sum3 += stats[i];
|
|
15525
|
-
const
|
|
15525
|
+
const mean7 = sum3 / n;
|
|
15526
15526
|
let sq = 0;
|
|
15527
|
-
for (let i = 0; i < n; i++) sq += (stats[i] -
|
|
15527
|
+
for (let i = 0; i < n; i++) sq += (stats[i] - mean7) ** 2;
|
|
15528
15528
|
const std2 = n > 1 ? Math.sqrt(sq / (n - 1)) : 0;
|
|
15529
|
-
return { bootstrapMean:
|
|
15529
|
+
return { bootstrapMean: mean7, bootstrapStd: std2 };
|
|
15530
15530
|
}
|
|
15531
15531
|
function _mean(arr7) {
|
|
15532
15532
|
let sum3 = 0;
|
|
@@ -16250,9 +16250,9 @@ function principalComponentAnalysis(data, k) {
|
|
|
16250
16250
|
const explained = eigenvalues.map((ev) => totalVar > 0 ? Math.abs(ev) / totalVar : 0);
|
|
16251
16251
|
const scores = centered.map((row2) => {
|
|
16252
16252
|
return eigenvectors.map((ev) => {
|
|
16253
|
-
let
|
|
16254
|
-
for (let j = 0; j < p; j++)
|
|
16255
|
-
return
|
|
16253
|
+
let dot5 = 0;
|
|
16254
|
+
for (let j = 0; j < p; j++) dot5 += row2[j] * ev[j];
|
|
16255
|
+
return dot5;
|
|
16256
16256
|
});
|
|
16257
16257
|
});
|
|
16258
16258
|
return { components: eigenvectors, explained, scores };
|
|
@@ -16293,7 +16293,7 @@ function _median(arr7) {
|
|
|
16293
16293
|
const m = n >> 1;
|
|
16294
16294
|
return n % 2 === 1 ? s[m] : (s[m - 1] + s[m]) / 2;
|
|
16295
16295
|
}
|
|
16296
|
-
function leveneTest(groups,
|
|
16296
|
+
function leveneTest(groups, center2 = "median") {
|
|
16297
16297
|
const k = groups.length;
|
|
16298
16298
|
if (k < 2) throw new Error("leveneTest: need at least 2 groups");
|
|
16299
16299
|
let N = 0;
|
|
@@ -16302,7 +16302,7 @@ function leveneTest(groups, center = "median") {
|
|
|
16302
16302
|
N += g.length;
|
|
16303
16303
|
}
|
|
16304
16304
|
const z = groups.map((g) => {
|
|
16305
|
-
const c =
|
|
16305
|
+
const c = center2 === "median" ? _median(g) : _mean(g);
|
|
16306
16306
|
return g.map((x) => Math.abs(x - c));
|
|
16307
16307
|
});
|
|
16308
16308
|
const allZ = [];
|
|
@@ -16410,13 +16410,13 @@ function andersonDarlingTest(data) {
|
|
|
16410
16410
|
const n = data.length;
|
|
16411
16411
|
if (n < 8) throw new Error("andersonDarlingTest: need at least 8 observations");
|
|
16412
16412
|
const sorted = data.slice().sort((p2, q) => p2 - q);
|
|
16413
|
-
const
|
|
16413
|
+
const mean7 = _mean(sorted);
|
|
16414
16414
|
const s = Math.sqrt(_variance(sorted, 1));
|
|
16415
16415
|
const phi = (z) => 0.5 * erfcScalar(-z / Math.SQRT2);
|
|
16416
16416
|
let sumTerm = 0;
|
|
16417
16417
|
for (let i = 0; i < n; i++) {
|
|
16418
|
-
const wi = (sorted[i] -
|
|
16419
|
-
const wj = (sorted[n - 1 - i] -
|
|
16418
|
+
const wi = (sorted[i] - mean7) / s;
|
|
16419
|
+
const wj = (sorted[n - 1 - i] - mean7) / s;
|
|
16420
16420
|
sumTerm += (2 * (i + 1) - 1) / n * (Math.log(phi(wi)) + Math.log(1 - phi(wj)));
|
|
16421
16421
|
}
|
|
16422
16422
|
const a2 = -n - sumTerm;
|
|
@@ -16863,30 +16863,30 @@ function hessenbergForm(A) {
|
|
|
16863
16863
|
if (normV < 1e-30) continue;
|
|
16864
16864
|
const beta2 = 2 / normV;
|
|
16865
16865
|
for (let j = k; j < n; j++) {
|
|
16866
|
-
let
|
|
16866
|
+
let dot5 = 0;
|
|
16867
16867
|
for (let i = 0; i < len; i++) {
|
|
16868
|
-
|
|
16868
|
+
dot5 += v[i] * H[k + 1 + i][j];
|
|
16869
16869
|
}
|
|
16870
16870
|
for (let i = 0; i < len; i++) {
|
|
16871
|
-
H[k + 1 + i][j] -= beta2 * v[i] *
|
|
16871
|
+
H[k + 1 + i][j] -= beta2 * v[i] * dot5;
|
|
16872
16872
|
}
|
|
16873
16873
|
}
|
|
16874
16874
|
for (let i = 0; i < n; i++) {
|
|
16875
|
-
let
|
|
16875
|
+
let dot5 = 0;
|
|
16876
16876
|
for (let j = 0; j < len; j++) {
|
|
16877
|
-
|
|
16877
|
+
dot5 += H[i][k + 1 + j] * v[j];
|
|
16878
16878
|
}
|
|
16879
16879
|
for (let j = 0; j < len; j++) {
|
|
16880
|
-
H[i][k + 1 + j] -= beta2 *
|
|
16880
|
+
H[i][k + 1 + j] -= beta2 * dot5 * v[j];
|
|
16881
16881
|
}
|
|
16882
16882
|
}
|
|
16883
16883
|
for (let i = 0; i < n; i++) {
|
|
16884
|
-
let
|
|
16884
|
+
let dot5 = 0;
|
|
16885
16885
|
for (let j = 0; j < len; j++) {
|
|
16886
|
-
|
|
16886
|
+
dot5 += Q2[i][k + 1 + j] * v[j];
|
|
16887
16887
|
}
|
|
16888
16888
|
for (let j = 0; j < len; j++) {
|
|
16889
|
-
Q2[i][k + 1 + j] -= beta2 *
|
|
16889
|
+
Q2[i][k + 1 + j] -= beta2 * dot5 * v[j];
|
|
16890
16890
|
}
|
|
16891
16891
|
}
|
|
16892
16892
|
}
|
|
@@ -22678,10 +22678,10 @@ var dependencies85 = ["typed", "transpose", "conj"];
|
|
|
22678
22678
|
var createCtranspose = /* @__PURE__ */ factory(
|
|
22679
22679
|
name85,
|
|
22680
22680
|
dependencies85,
|
|
22681
|
-
({ typed: typed3, transpose:
|
|
22681
|
+
({ typed: typed3, transpose: transpose4, conj: conj3 }) => {
|
|
22682
22682
|
return typed3(name85, {
|
|
22683
22683
|
any: function(x) {
|
|
22684
|
-
return conj3(
|
|
22684
|
+
return conj3(transpose4(x));
|
|
22685
22685
|
}
|
|
22686
22686
|
});
|
|
22687
22687
|
}
|
|
@@ -23671,7 +23671,7 @@ var dependencies98 = ["add", "multiply", "transpose"];
|
|
|
23671
23671
|
var createCsAmd = /* @__PURE__ */ factory(
|
|
23672
23672
|
name98,
|
|
23673
23673
|
dependencies98,
|
|
23674
|
-
({ add: add2, multiply: multiply2, transpose:
|
|
23674
|
+
({ add: add2, multiply: multiply2, transpose: transpose4 }) => {
|
|
23675
23675
|
function _tryWasmAmd(a, n) {
|
|
23676
23676
|
const wasm = wasmLoader.getModule();
|
|
23677
23677
|
if (!wasm || !a._ptr || !a._index) return null;
|
|
@@ -23965,7 +23965,7 @@ var createCsAmd = /* @__PURE__ */ factory(
|
|
|
23965
23965
|
return P2;
|
|
23966
23966
|
};
|
|
23967
23967
|
function _createTargetMatrix(order, a, m, n, dense) {
|
|
23968
|
-
const at =
|
|
23968
|
+
const at = transpose4(a);
|
|
23969
23969
|
if (order === 1 && n === m) {
|
|
23970
23970
|
return add2(a, at);
|
|
23971
23971
|
}
|
|
@@ -23984,7 +23984,7 @@ var createCsAmd = /* @__PURE__ */ factory(
|
|
|
23984
23984
|
}
|
|
23985
23985
|
}
|
|
23986
23986
|
tptr[m] = p2;
|
|
23987
|
-
a =
|
|
23987
|
+
a = transpose4(at);
|
|
23988
23988
|
return multiply2(at, a);
|
|
23989
23989
|
}
|
|
23990
23990
|
return multiply2(at, a);
|
|
@@ -24085,7 +24085,7 @@ var dependencies99 = ["transpose"];
|
|
|
24085
24085
|
var createCsCounts = /* @__PURE__ */ factory(
|
|
24086
24086
|
name99,
|
|
24087
24087
|
dependencies99,
|
|
24088
|
-
({ transpose:
|
|
24088
|
+
({ transpose: transpose4 }) => {
|
|
24089
24089
|
function _tryWasmCounts(a, parent, post, n) {
|
|
24090
24090
|
const wasm = wasmLoader.getModule();
|
|
24091
24091
|
if (!wasm || n < WASM_COUNTS_THRESHOLD || !a._index || !a._ptr) return null;
|
|
@@ -24147,7 +24147,7 @@ var createCsCounts = /* @__PURE__ */ factory(
|
|
|
24147
24147
|
w[k] = -1;
|
|
24148
24148
|
}
|
|
24149
24149
|
const colcount = [];
|
|
24150
|
-
const at =
|
|
24150
|
+
const at = transpose4(a);
|
|
24151
24151
|
const tindex = at._index;
|
|
24152
24152
|
const tptr = at._ptr;
|
|
24153
24153
|
for (k = 0; k < n; k++) {
|
|
@@ -24316,9 +24316,9 @@ var dependencies100 = ["add", "multiply", "transpose"];
|
|
|
24316
24316
|
var createCsSqr = /* @__PURE__ */ factory(
|
|
24317
24317
|
name100,
|
|
24318
24318
|
dependencies100,
|
|
24319
|
-
({ add: add2, multiply: multiply2, transpose:
|
|
24320
|
-
const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose:
|
|
24321
|
-
const csCounts2 = createCsCounts({ transpose:
|
|
24319
|
+
({ add: add2, multiply: multiply2, transpose: transpose4 }) => {
|
|
24320
|
+
const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose: transpose4 });
|
|
24321
|
+
const csCounts2 = createCsCounts({ transpose: transpose4 });
|
|
24322
24322
|
return function csSqr2(order, a, qr2) {
|
|
24323
24323
|
const aptr = a._ptr;
|
|
24324
24324
|
const asize = a._size;
|
|
@@ -30198,7 +30198,7 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30198
30198
|
deepEqual: deepEqual3,
|
|
30199
30199
|
equal: equal2,
|
|
30200
30200
|
dotDivide: dotDivide2,
|
|
30201
|
-
dot:
|
|
30201
|
+
dot: dot5,
|
|
30202
30202
|
ctranspose: ctranspose2,
|
|
30203
30203
|
divideScalar: divideScalar2,
|
|
30204
30204
|
multiply: multiply2,
|
|
@@ -30214,7 +30214,7 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30214
30214
|
if (size2[0] === 1) {
|
|
30215
30215
|
return inv2(x);
|
|
30216
30216
|
} else {
|
|
30217
|
-
return dotDivide2(ctranspose2(x),
|
|
30217
|
+
return dotDivide2(ctranspose2(x), dot5(x, x));
|
|
30218
30218
|
}
|
|
30219
30219
|
case 2: {
|
|
30220
30220
|
if (_isZeros(x)) return ctranspose2(x);
|
|
@@ -30293,8 +30293,8 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30293
30293
|
}
|
|
30294
30294
|
function _rankFact(mat, rows, cols) {
|
|
30295
30295
|
const rref = _rref(mat, rows, cols);
|
|
30296
|
-
const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(
|
|
30297
|
-
const F = rref.filter((_, i) => !_isZero(
|
|
30296
|
+
const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot5(rref[j], rref[j]))));
|
|
30297
|
+
const F = rref.filter((_, i) => !_isZero(dot5(rref[i], rref[i])));
|
|
30298
30298
|
return { C, F };
|
|
30299
30299
|
}
|
|
30300
30300
|
function _isZero(x) {
|
|
@@ -35027,14 +35027,14 @@ var createSlu = /* @__PURE__ */ factory(
|
|
|
35027
35027
|
abs: abs2,
|
|
35028
35028
|
add: add2,
|
|
35029
35029
|
multiply: multiply2,
|
|
35030
|
-
transpose:
|
|
35030
|
+
transpose: transpose4,
|
|
35031
35031
|
divideScalar: divideScalar2,
|
|
35032
35032
|
subtract: subtract2,
|
|
35033
35033
|
larger: larger2,
|
|
35034
35034
|
largerEq: largerEq2,
|
|
35035
35035
|
SparseMatrix
|
|
35036
35036
|
}) => {
|
|
35037
|
-
const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose:
|
|
35037
|
+
const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose: transpose4 });
|
|
35038
35038
|
const csLu2 = createCsLu({
|
|
35039
35039
|
abs: abs2,
|
|
35040
35040
|
divideScalar: divideScalar2,
|
|
@@ -35788,10 +35788,10 @@ var createVariance = /* @__PURE__ */ factory(
|
|
|
35788
35788
|
}
|
|
35789
35789
|
});
|
|
35790
35790
|
if (num2 === 0) throw new Error("Cannot calculate variance of an empty array");
|
|
35791
|
-
const
|
|
35791
|
+
const mean7 = divide2(sum3, num2);
|
|
35792
35792
|
sum3 = void 0;
|
|
35793
35793
|
deepForEach2(array, function(value) {
|
|
35794
|
-
const diff2 = subtract2(value,
|
|
35794
|
+
const diff2 = subtract2(value, mean7);
|
|
35795
35795
|
sum3 = sum3 === void 0 ? multiply2(diff2, diff2) : add2(sum3, multiply2(diff2, diff2));
|
|
35796
35796
|
});
|
|
35797
35797
|
if (mathIsNaN(sum3)) {
|
|
@@ -37257,7 +37257,7 @@ function createComplexEigs({
|
|
|
37257
37257
|
larger: larger2,
|
|
37258
37258
|
smaller: smaller2,
|
|
37259
37259
|
matrixFromColumns: _matrixFromColumns,
|
|
37260
|
-
dot:
|
|
37260
|
+
dot: dot5
|
|
37261
37261
|
}) {
|
|
37262
37262
|
function complexEigs(arr7, N, prec, type, findVectors = true) {
|
|
37263
37263
|
if (!findVectors && type === "number" && N * N >= WASM_EIGS_THRESHOLD) {
|
|
@@ -37698,7 +37698,7 @@ function createComplexEigs({
|
|
|
37698
37698
|
v = subtract2(
|
|
37699
37699
|
v,
|
|
37700
37700
|
multiply2(
|
|
37701
|
-
divideScalar2(
|
|
37701
|
+
divideScalar2(dot5(w, v), dot5(w, w)),
|
|
37702
37702
|
w
|
|
37703
37703
|
)
|
|
37704
37704
|
);
|
|
@@ -37706,7 +37706,7 @@ function createComplexEigs({
|
|
|
37706
37706
|
return v;
|
|
37707
37707
|
}
|
|
37708
37708
|
function norm4(v) {
|
|
37709
|
-
return abs2(sqrt2(
|
|
37709
|
+
return abs2(sqrt2(dot5(v, v)));
|
|
37710
37710
|
}
|
|
37711
37711
|
function normalize2(v, type) {
|
|
37712
37712
|
const big = type === "BigNumber";
|
|
@@ -38126,7 +38126,7 @@ var createEigs = /* @__PURE__ */ factory(
|
|
|
38126
38126
|
re: re3,
|
|
38127
38127
|
smaller: smaller2,
|
|
38128
38128
|
matrixFromColumns: matrixFromColumns2,
|
|
38129
|
-
dot:
|
|
38129
|
+
dot: dot5
|
|
38130
38130
|
}) => {
|
|
38131
38131
|
const doRealSymmetric = createRealSymmetric({
|
|
38132
38132
|
config: config2,
|
|
@@ -38165,7 +38165,7 @@ var createEigs = /* @__PURE__ */ factory(
|
|
|
38165
38165
|
larger: larger2,
|
|
38166
38166
|
smaller: smaller2,
|
|
38167
38167
|
matrixFromColumns: matrixFromColumns2,
|
|
38168
|
-
dot:
|
|
38168
|
+
dot: dot5
|
|
38169
38169
|
});
|
|
38170
38170
|
return typed3("eigs", {
|
|
38171
38171
|
// The conversion to matrix in the first two implementations,
|
|
@@ -41147,7 +41147,7 @@ var createSylvester = /* @__PURE__ */ factory(
|
|
|
41147
41147
|
multiply: multiply2,
|
|
41148
41148
|
range: range2,
|
|
41149
41149
|
concat: concat3,
|
|
41150
|
-
transpose:
|
|
41150
|
+
transpose: transpose4,
|
|
41151
41151
|
index,
|
|
41152
41152
|
subset: subset2,
|
|
41153
41153
|
add: add2,
|
|
@@ -41189,7 +41189,7 @@ var createSylvester = /* @__PURE__ */ factory(
|
|
|
41189
41189
|
const sB = schur2(multiply2(-1, B));
|
|
41190
41190
|
const G = sB.T;
|
|
41191
41191
|
const V = sB.U;
|
|
41192
|
-
const D = multiply2(multiply2(
|
|
41192
|
+
const D = multiply2(multiply2(transpose4(U), C), V);
|
|
41193
41193
|
const all = range2(0, m);
|
|
41194
41194
|
const y = [];
|
|
41195
41195
|
const hc = (a, b) => concat3(a, b, 1);
|
|
@@ -41223,7 +41223,7 @@ var createSylvester = /* @__PURE__ */ factory(
|
|
|
41223
41223
|
}
|
|
41224
41224
|
}
|
|
41225
41225
|
const Y = matrix2(matrixFromColumns2(...y));
|
|
41226
|
-
const X = multiply2(U, multiply2(Y,
|
|
41226
|
+
const X = multiply2(U, multiply2(Y, transpose4(V)));
|
|
41227
41227
|
return X;
|
|
41228
41228
|
}
|
|
41229
41229
|
}
|
|
@@ -41235,21 +41235,21 @@ var dependencies253 = ["typed", "matrix", "sylvester", "multiply", "transpose"];
|
|
|
41235
41235
|
var createLyap = /* @__PURE__ */ factory(
|
|
41236
41236
|
name253,
|
|
41237
41237
|
dependencies253,
|
|
41238
|
-
({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose:
|
|
41238
|
+
({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose: transpose4 }) => {
|
|
41239
41239
|
return typed3(name253, {
|
|
41240
41240
|
"Matrix, Matrix": function(A, Q2) {
|
|
41241
|
-
return sylvester2(A,
|
|
41241
|
+
return sylvester2(A, transpose4(A), multiply2(-1, Q2));
|
|
41242
41242
|
},
|
|
41243
41243
|
"Array, Matrix": function(A, Q2) {
|
|
41244
|
-
return sylvester2(matrix2(A),
|
|
41244
|
+
return sylvester2(matrix2(A), transpose4(matrix2(A)), multiply2(-1, Q2));
|
|
41245
41245
|
},
|
|
41246
41246
|
"Matrix, Array": function(A, Q2) {
|
|
41247
|
-
return sylvester2(A,
|
|
41247
|
+
return sylvester2(A, transpose4(A), matrix2(multiply2(-1, Q2)));
|
|
41248
41248
|
},
|
|
41249
41249
|
"Array, Array": function(A, Q2) {
|
|
41250
41250
|
return sylvester2(
|
|
41251
41251
|
matrix2(A),
|
|
41252
|
-
|
|
41252
|
+
transpose4(matrix2(A)),
|
|
41253
41253
|
matrix2(multiply2(-1, Q2))
|
|
41254
41254
|
).toArray();
|
|
41255
41255
|
}
|
|
@@ -45455,6 +45455,297 @@ function linearRegression(x, y) {
|
|
|
45455
45455
|
return { slope, intercept, rValue, rSquared: rValue * rValue, pValue, stdErr };
|
|
45456
45456
|
}
|
|
45457
45457
|
|
|
45458
|
+
// src/ml/ols.ts
|
|
45459
|
+
function transpose3(m) {
|
|
45460
|
+
const rows = m.length;
|
|
45461
|
+
const cols = m[0].length;
|
|
45462
|
+
const out = Array.from({ length: cols }, () => new Array(rows).fill(0));
|
|
45463
|
+
for (let i = 0; i < rows; i++) {
|
|
45464
|
+
for (let j = 0; j < cols; j++) {
|
|
45465
|
+
out[j][i] = m[i][j];
|
|
45466
|
+
}
|
|
45467
|
+
}
|
|
45468
|
+
return out;
|
|
45469
|
+
}
|
|
45470
|
+
function matmul2(a, b) {
|
|
45471
|
+
const n = a.length;
|
|
45472
|
+
const k = b.length;
|
|
45473
|
+
const m = b[0].length;
|
|
45474
|
+
const out = Array.from({ length: n }, () => new Array(m).fill(0));
|
|
45475
|
+
for (let i = 0; i < n; i++) {
|
|
45476
|
+
for (let c = 0; c < k; c++) {
|
|
45477
|
+
const aic = a[i][c];
|
|
45478
|
+
if (aic === 0) continue;
|
|
45479
|
+
for (let j = 0; j < m; j++) {
|
|
45480
|
+
out[i][j] += aic * b[c][j];
|
|
45481
|
+
}
|
|
45482
|
+
}
|
|
45483
|
+
}
|
|
45484
|
+
return out;
|
|
45485
|
+
}
|
|
45486
|
+
function matVec(a, v) {
|
|
45487
|
+
return a.map((row2) => row2.reduce((sum3, val, j) => sum3 + val * v[j], 0));
|
|
45488
|
+
}
|
|
45489
|
+
function invert(a) {
|
|
45490
|
+
const n = a.length;
|
|
45491
|
+
const M = a.map((row2, i) => [...row2, ...Array.from({ length: n }, (_, j) => i === j ? 1 : 0)]);
|
|
45492
|
+
for (let col = 0; col < n; col++) {
|
|
45493
|
+
let pivotRow = col;
|
|
45494
|
+
let maxVal = Math.abs(M[col][col]);
|
|
45495
|
+
for (let row2 = col + 1; row2 < n; row2++) {
|
|
45496
|
+
if (Math.abs(M[row2][col]) > maxVal) {
|
|
45497
|
+
maxVal = Math.abs(M[row2][col]);
|
|
45498
|
+
pivotRow = row2;
|
|
45499
|
+
}
|
|
45500
|
+
}
|
|
45501
|
+
if (maxVal < 1e-15) throw new Error("ols: X^T X is singular (predictors are collinear)");
|
|
45502
|
+
if (pivotRow !== col) [M[col], M[pivotRow]] = [M[pivotRow], M[col]];
|
|
45503
|
+
const pivot = M[col][col];
|
|
45504
|
+
for (let j = 0; j < 2 * n; j++) M[col][j] /= pivot;
|
|
45505
|
+
for (let row2 = 0; row2 < n; row2++) {
|
|
45506
|
+
if (row2 === col) continue;
|
|
45507
|
+
const factor2 = M[row2][col];
|
|
45508
|
+
if (factor2 === 0) continue;
|
|
45509
|
+
for (let j = 0; j < 2 * n; j++) {
|
|
45510
|
+
M[row2][j] -= factor2 * M[col][j];
|
|
45511
|
+
}
|
|
45512
|
+
}
|
|
45513
|
+
}
|
|
45514
|
+
return M.map((row2) => row2.slice(n));
|
|
45515
|
+
}
|
|
45516
|
+
function ols(X, y, opts) {
|
|
45517
|
+
const n = X.length;
|
|
45518
|
+
if (n === 0) throw new Error("ols: empty design matrix");
|
|
45519
|
+
if (y.length !== n) throw new Error(`ols: length mismatch (X has ${n} rows, y has ${y.length})`);
|
|
45520
|
+
const useIntercept = opts?.intercept !== false;
|
|
45521
|
+
const design = useIntercept ? X.map((row2) => [1, ...row2]) : X.map((row2) => [...row2]);
|
|
45522
|
+
const p = design[0].length;
|
|
45523
|
+
if (n <= p) throw new Error(`ols: need more observations (${n}) than parameters (${p})`);
|
|
45524
|
+
const Xt = transpose3(design);
|
|
45525
|
+
const XtX = matmul2(Xt, design);
|
|
45526
|
+
const Xty = matVec(Xt, y);
|
|
45527
|
+
const XtXinv = invert(XtX);
|
|
45528
|
+
const coefficients = matVec(XtXinv, Xty);
|
|
45529
|
+
const fitted = matVec(design, coefficients);
|
|
45530
|
+
const residuals = y.map((yi, i) => yi - fitted[i]);
|
|
45531
|
+
const rss = residuals.reduce((sum3, e) => sum3 + e * e, 0);
|
|
45532
|
+
const yMean = y.reduce((sum3, v) => sum3 + v, 0) / n;
|
|
45533
|
+
const tss = y.reduce((sum3, v) => sum3 + (v - yMean) * (v - yMean), 0);
|
|
45534
|
+
const dfResid = n - p;
|
|
45535
|
+
const sigma2 = rss / dfResid;
|
|
45536
|
+
const stderr = XtXinv.map((row2, j) => Math.sqrt(sigma2 * row2[j]));
|
|
45537
|
+
const tValues = coefficients.map((b, j) => b / stderr[j]);
|
|
45538
|
+
const pValues = tValues.map((t) => 2 * (1 - studentTCDF(Math.abs(t), dfResid)));
|
|
45539
|
+
const r2 = tss === 0 ? 1 : 1 - rss / tss;
|
|
45540
|
+
const adjR2 = 1 - (1 - r2) * (n - 1) / dfResid;
|
|
45541
|
+
const fStat = p > 1 ? (tss - rss) / (p - 1) / (rss / dfResid) : NaN;
|
|
45542
|
+
return { coefficients, stderr, tValues, pValues, r2, adjR2, fStat, residuals };
|
|
45543
|
+
}
|
|
45544
|
+
|
|
45545
|
+
// src/ml/regularized-regression.ts
|
|
45546
|
+
function validate(X, y, name254) {
|
|
45547
|
+
const n = X.length;
|
|
45548
|
+
if (n === 0) throw new Error(`${name254}: empty design matrix`);
|
|
45549
|
+
if (y.length !== n) {
|
|
45550
|
+
throw new Error(`${name254}: length mismatch (X has ${n} rows, y has ${y.length})`);
|
|
45551
|
+
}
|
|
45552
|
+
const p = X[0].length;
|
|
45553
|
+
if (p === 0) throw new Error(`${name254}: X must have at least one predictor column`);
|
|
45554
|
+
return { n, p };
|
|
45555
|
+
}
|
|
45556
|
+
function colMeans(X, n, p) {
|
|
45557
|
+
const means = new Array(p).fill(0);
|
|
45558
|
+
for (const row2 of X) {
|
|
45559
|
+
for (let j = 0; j < p; j++) means[j] += row2[j];
|
|
45560
|
+
}
|
|
45561
|
+
for (let j = 0; j < p; j++) means[j] /= n;
|
|
45562
|
+
return means;
|
|
45563
|
+
}
|
|
45564
|
+
function mean6(y) {
|
|
45565
|
+
return y.reduce((s, v) => s + v, 0) / y.length;
|
|
45566
|
+
}
|
|
45567
|
+
function center(X, y, n, p, useIntercept) {
|
|
45568
|
+
const xMean = useIntercept ? colMeans(X, n, p) : new Array(p).fill(0);
|
|
45569
|
+
const yMean = useIntercept ? mean6(y) : 0;
|
|
45570
|
+
const Xc = X.map((row2) => row2.map((v, j) => v - xMean[j]));
|
|
45571
|
+
const yc = y.map((v) => v - yMean);
|
|
45572
|
+
return { Xc, yc, xMean, yMean };
|
|
45573
|
+
}
|
|
45574
|
+
function dot2(a, b) {
|
|
45575
|
+
let s = 0;
|
|
45576
|
+
for (let i = 0; i < a.length; i++) s += a[i] * b[i];
|
|
45577
|
+
return s;
|
|
45578
|
+
}
|
|
45579
|
+
function softThreshold(a, lambda) {
|
|
45580
|
+
if (a > lambda) return a - lambda;
|
|
45581
|
+
if (a < -lambda) return a + lambda;
|
|
45582
|
+
return 0;
|
|
45583
|
+
}
|
|
45584
|
+
function ridge(X, y, alpha, opts) {
|
|
45585
|
+
const { n, p } = validate(X, y, "ridge");
|
|
45586
|
+
if (alpha < 0) throw new Error("ridge: alpha must be non-negative");
|
|
45587
|
+
const useIntercept = opts?.intercept !== false;
|
|
45588
|
+
const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
|
|
45589
|
+
const XtX = Array.from({ length: p }, () => new Array(p).fill(0));
|
|
45590
|
+
const Xty = new Array(p).fill(0);
|
|
45591
|
+
for (let j = 0; j < p; j++) {
|
|
45592
|
+
for (let k = j; k < p; k++) {
|
|
45593
|
+
let s = 0;
|
|
45594
|
+
for (let i = 0; i < n; i++) s += Xc[i][j] * Xc[i][k];
|
|
45595
|
+
XtX[j][k] = s;
|
|
45596
|
+
XtX[k][j] = s;
|
|
45597
|
+
}
|
|
45598
|
+
XtX[j][j] += alpha;
|
|
45599
|
+
for (let i = 0; i < n; i++) Xty[j] += Xc[i][j] * yc[i];
|
|
45600
|
+
}
|
|
45601
|
+
const coefficients = linsolve(XtX, Xty);
|
|
45602
|
+
const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
|
|
45603
|
+
return { coefficients, intercept };
|
|
45604
|
+
}
|
|
45605
|
+
function standardize(Xc, n, p) {
|
|
45606
|
+
const scale = new Array(p);
|
|
45607
|
+
for (let j = 0; j < p; j++) {
|
|
45608
|
+
let ss = 0;
|
|
45609
|
+
for (let i = 0; i < n; i++) ss += Xc[i][j] * Xc[i][j];
|
|
45610
|
+
const meanSq = ss / n;
|
|
45611
|
+
scale[j] = meanSq > 1e-15 ? Math.sqrt(meanSq) : 1;
|
|
45612
|
+
}
|
|
45613
|
+
const Xs = Xc.map((row2) => row2.map((v, j) => v / scale[j]));
|
|
45614
|
+
return { Xs, scale };
|
|
45615
|
+
}
|
|
45616
|
+
function coordinateDescent(Xs, yc, n, p, l1, l2, maxIter, tol) {
|
|
45617
|
+
const beta2 = new Array(p).fill(0);
|
|
45618
|
+
const z = new Array(p).fill(n);
|
|
45619
|
+
const residual = [...yc];
|
|
45620
|
+
for (let iter = 0; iter < maxIter; iter++) {
|
|
45621
|
+
let maxChange = 0;
|
|
45622
|
+
for (let j = 0; j < p; j++) {
|
|
45623
|
+
const col = Xs.map((row2) => row2[j]);
|
|
45624
|
+
const oldBeta = beta2[j];
|
|
45625
|
+
let rho = 0;
|
|
45626
|
+
for (let i = 0; i < n; i++) rho += col[i] * (residual[i] + col[i] * oldBeta);
|
|
45627
|
+
const newBeta = softThreshold(rho, l1) / (z[j] + l2);
|
|
45628
|
+
if (newBeta !== oldBeta) {
|
|
45629
|
+
const delta = newBeta - oldBeta;
|
|
45630
|
+
for (let i = 0; i < n; i++) residual[i] -= col[i] * delta;
|
|
45631
|
+
beta2[j] = newBeta;
|
|
45632
|
+
maxChange = Math.max(maxChange, Math.abs(delta));
|
|
45633
|
+
}
|
|
45634
|
+
}
|
|
45635
|
+
if (maxChange < tol) break;
|
|
45636
|
+
}
|
|
45637
|
+
return beta2;
|
|
45638
|
+
}
|
|
45639
|
+
function lasso(X, y, alpha, opts) {
|
|
45640
|
+
const { n, p } = validate(X, y, "lasso");
|
|
45641
|
+
if (alpha < 0) throw new Error("lasso: alpha must be non-negative");
|
|
45642
|
+
const useIntercept = opts?.intercept !== false;
|
|
45643
|
+
const maxIter = opts?.maxIter ?? 1e3;
|
|
45644
|
+
const tol = opts?.tol ?? 1e-7;
|
|
45645
|
+
const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
|
|
45646
|
+
const { Xs, scale } = standardize(Xc, n, p);
|
|
45647
|
+
const betaStd = coordinateDescent(Xs, yc, n, p, alpha, 0, maxIter, tol);
|
|
45648
|
+
const coefficients = betaStd.map((b, j) => b / scale[j]);
|
|
45649
|
+
const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
|
|
45650
|
+
return { coefficients, intercept };
|
|
45651
|
+
}
|
|
45652
|
+
function elasticNet(X, y, alpha, l1Ratio, opts) {
|
|
45653
|
+
const { n, p } = validate(X, y, "elasticNet");
|
|
45654
|
+
if (alpha < 0) throw new Error("elasticNet: alpha must be non-negative");
|
|
45655
|
+
if (l1Ratio < 0 || l1Ratio > 1) throw new Error("elasticNet: l1Ratio must be in [0, 1]");
|
|
45656
|
+
const useIntercept = opts?.intercept !== false;
|
|
45657
|
+
const maxIter = opts?.maxIter ?? 1e3;
|
|
45658
|
+
const tol = opts?.tol ?? 1e-7;
|
|
45659
|
+
const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
|
|
45660
|
+
const { Xs, scale } = standardize(Xc, n, p);
|
|
45661
|
+
const l1 = alpha * l1Ratio;
|
|
45662
|
+
const l2 = alpha * (1 - l1Ratio);
|
|
45663
|
+
const betaStd = coordinateDescent(Xs, yc, n, p, l1, l2, maxIter, tol);
|
|
45664
|
+
const coefficients = betaStd.map((b, j) => b / scale[j]);
|
|
45665
|
+
const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
|
|
45666
|
+
return { coefficients, intercept };
|
|
45667
|
+
}
|
|
45668
|
+
|
|
45669
|
+
// src/ml/logistic-regression.ts
|
|
45670
|
+
function sigmoid2(z) {
|
|
45671
|
+
if (z >= 0) {
|
|
45672
|
+
const e2 = Math.exp(-z);
|
|
45673
|
+
return 1 / (1 + e2);
|
|
45674
|
+
}
|
|
45675
|
+
const e = Math.exp(z);
|
|
45676
|
+
return e / (1 + e);
|
|
45677
|
+
}
|
|
45678
|
+
var MAX_STEP_NORM = 25;
|
|
45679
|
+
function logisticRegression(X, y, opts) {
|
|
45680
|
+
const n = X.length;
|
|
45681
|
+
if (n === 0) throw new Error("logisticRegression: empty design matrix");
|
|
45682
|
+
if (y.length !== n) {
|
|
45683
|
+
throw new Error(`logisticRegression: length mismatch (X has ${n} rows, y has ${y.length})`);
|
|
45684
|
+
}
|
|
45685
|
+
for (const yi of y) {
|
|
45686
|
+
if (yi !== 0 && yi !== 1) {
|
|
45687
|
+
throw new Error("logisticRegression: y must be binary (0 or 1)");
|
|
45688
|
+
}
|
|
45689
|
+
}
|
|
45690
|
+
const useIntercept = opts?.intercept !== false;
|
|
45691
|
+
const tol = opts?.tol ?? 1e-8;
|
|
45692
|
+
const maxIter = opts?.maxIter ?? 100;
|
|
45693
|
+
const design = (rows) => useIntercept ? rows.map((row2) => [1, ...row2]) : rows.map((row2) => [...row2]);
|
|
45694
|
+
const D = design(X);
|
|
45695
|
+
const p = D[0].length;
|
|
45696
|
+
let beta2 = new Array(p).fill(0);
|
|
45697
|
+
for (let iter = 0; iter < maxIter; iter++) {
|
|
45698
|
+
const eta = D.map((row2) => row2.reduce((s, v, j) => s + v * beta2[j], 0));
|
|
45699
|
+
const probs = eta.map(sigmoid2);
|
|
45700
|
+
const weights = probs.map((pi) => Math.max(pi * (1 - pi), 1e-9));
|
|
45701
|
+
const XtWX = Array.from({ length: p }, () => new Array(p).fill(0));
|
|
45702
|
+
for (let i = 0; i < n; i++) {
|
|
45703
|
+
const w = weights[i];
|
|
45704
|
+
const row2 = D[i];
|
|
45705
|
+
for (let a = 0; a < p; a++) {
|
|
45706
|
+
const wa = w * row2[a];
|
|
45707
|
+
if (wa === 0) continue;
|
|
45708
|
+
for (let b = 0; b < p; b++) {
|
|
45709
|
+
XtWX[a][b] += wa * row2[b];
|
|
45710
|
+
}
|
|
45711
|
+
}
|
|
45712
|
+
}
|
|
45713
|
+
const score = new Array(p).fill(0);
|
|
45714
|
+
for (let i = 0; i < n; i++) {
|
|
45715
|
+
const resid = y[i] - probs[i];
|
|
45716
|
+
const row2 = D[i];
|
|
45717
|
+
for (let a = 0; a < p; a++) {
|
|
45718
|
+
score[a] += row2[a] * resid;
|
|
45719
|
+
}
|
|
45720
|
+
}
|
|
45721
|
+
const ridgeEps = 1e-8;
|
|
45722
|
+
const regularized = XtWX.map((row2, a) => row2.map((v, b) => a === b ? v + ridgeEps : v));
|
|
45723
|
+
let delta;
|
|
45724
|
+
try {
|
|
45725
|
+
delta = linsolve(regularized, score);
|
|
45726
|
+
} catch {
|
|
45727
|
+
break;
|
|
45728
|
+
}
|
|
45729
|
+
let stepNorm = 0;
|
|
45730
|
+
for (const d of delta) stepNorm = Math.max(stepNorm, Math.abs(d));
|
|
45731
|
+
if (stepNorm > MAX_STEP_NORM) {
|
|
45732
|
+
const scale = MAX_STEP_NORM / stepNorm;
|
|
45733
|
+
delta = delta.map((d) => d * scale);
|
|
45734
|
+
stepNorm = MAX_STEP_NORM;
|
|
45735
|
+
}
|
|
45736
|
+
beta2 = beta2.map((b, j) => b + delta[j]);
|
|
45737
|
+
if (stepNorm < tol) break;
|
|
45738
|
+
}
|
|
45739
|
+
const intercept = useIntercept ? beta2[0] : 0;
|
|
45740
|
+
const coefficients = useIntercept ? beta2.slice(1) : beta2.slice();
|
|
45741
|
+
const predictProba = (x) => {
|
|
45742
|
+
const Dx = design(x);
|
|
45743
|
+
return Dx.map((row2) => sigmoid2(row2.reduce((s, v, j) => s + v * beta2[j], 0)));
|
|
45744
|
+
};
|
|
45745
|
+
const predict = (x) => predictProba(x).map((pi) => pi >= 0.5 ? 1 : 0);
|
|
45746
|
+
return { coefficients, intercept, predictProba, predict };
|
|
45747
|
+
}
|
|
45748
|
+
|
|
45458
45749
|
// src/optimization-extra.ts
|
|
45459
45750
|
var _inv2 = inv;
|
|
45460
45751
|
function nelderMead(f, x0, opts = {}) {
|
|
@@ -45623,10 +45914,10 @@ function kmeans(data, k, opts = {}) {
|
|
|
45623
45914
|
if (!Number.isInteger(k) || k < 1) throw new Error("kmeans: k must be a positive integer");
|
|
45624
45915
|
const d = data[0].length;
|
|
45625
45916
|
if (k > n) throw new Error("kmeans: k exceeds number of points");
|
|
45626
|
-
const
|
|
45627
|
-
for (const p of data) for (let j = 0; j < d; j++)
|
|
45917
|
+
const mean7 = new Array(d).fill(0);
|
|
45918
|
+
for (const p of data) for (let j = 0; j < d; j++) mean7[j] += p[j] / n;
|
|
45628
45919
|
let first = 0;
|
|
45629
|
-
for (let i = 1; i < n; i++) if (dist2(data[i],
|
|
45920
|
+
for (let i = 1; i < n; i++) if (dist2(data[i], mean7) < dist2(data[first], mean7)) first = i;
|
|
45630
45921
|
const centroids = [data[first].slice()];
|
|
45631
45922
|
while (centroids.length < k) {
|
|
45632
45923
|
let best = -1;
|
|
@@ -45692,6 +45983,211 @@ function spectralClustering(adjacency, k, opts = {}) {
|
|
|
45692
45983
|
return kmeans(embed, k, opts).labels;
|
|
45693
45984
|
}
|
|
45694
45985
|
|
|
45986
|
+
// src/ml/dbscan-knn.ts
|
|
45987
|
+
function euclidean(a, b) {
|
|
45988
|
+
let sum3 = 0;
|
|
45989
|
+
for (let i = 0; i < a.length; i++) {
|
|
45990
|
+
const d = a[i] - b[i];
|
|
45991
|
+
sum3 += d * d;
|
|
45992
|
+
}
|
|
45993
|
+
return Math.sqrt(sum3);
|
|
45994
|
+
}
|
|
45995
|
+
function regionQuery(points, i, eps) {
|
|
45996
|
+
const neighbors = [];
|
|
45997
|
+
for (let j = 0; j < points.length; j++) {
|
|
45998
|
+
if (euclidean(points[i], points[j]) <= eps) neighbors.push(j);
|
|
45999
|
+
}
|
|
46000
|
+
return neighbors;
|
|
46001
|
+
}
|
|
46002
|
+
function dbscan(points, eps, minPts) {
|
|
46003
|
+
const n = points.length;
|
|
46004
|
+
const labels = new Array(n).fill(-2);
|
|
46005
|
+
let clusterId = -1;
|
|
46006
|
+
for (let i = 0; i < n; i++) {
|
|
46007
|
+
if (labels[i] !== -2) continue;
|
|
46008
|
+
const neighbors = regionQuery(points, i, eps);
|
|
46009
|
+
if (neighbors.length < minPts) {
|
|
46010
|
+
labels[i] = -1;
|
|
46011
|
+
continue;
|
|
46012
|
+
}
|
|
46013
|
+
clusterId++;
|
|
46014
|
+
labels[i] = clusterId;
|
|
46015
|
+
const seeds = neighbors.filter((j) => j !== i);
|
|
46016
|
+
for (let s = 0; s < seeds.length; s++) {
|
|
46017
|
+
const j = seeds[s];
|
|
46018
|
+
if (labels[j] === -1) {
|
|
46019
|
+
labels[j] = clusterId;
|
|
46020
|
+
}
|
|
46021
|
+
if (labels[j] !== -2) continue;
|
|
46022
|
+
labels[j] = clusterId;
|
|
46023
|
+
const jNeighbors = regionQuery(points, j, eps);
|
|
46024
|
+
if (jNeighbors.length >= minPts) {
|
|
46025
|
+
for (const k of jNeighbors) {
|
|
46026
|
+
if (labels[k] === -2 || labels[k] === -1) seeds.push(k);
|
|
46027
|
+
}
|
|
46028
|
+
}
|
|
46029
|
+
}
|
|
46030
|
+
}
|
|
46031
|
+
return labels;
|
|
46032
|
+
}
|
|
46033
|
+
function kNearestIndices(train, q, k) {
|
|
46034
|
+
const dists = train.map((row2, i) => ({ i, d: euclidean(row2, q) }));
|
|
46035
|
+
dists.sort((a, b) => a.d - b.d);
|
|
46036
|
+
return dists.slice(0, Math.min(k, dists.length)).map((e) => e.i);
|
|
46037
|
+
}
|
|
46038
|
+
function knnClassify(train, labels, query, k) {
|
|
46039
|
+
return query.map((q) => {
|
|
46040
|
+
const idx = kNearestIndices(train, q, k);
|
|
46041
|
+
const counts = /* @__PURE__ */ new Map();
|
|
46042
|
+
for (const i of idx) {
|
|
46043
|
+
const lbl = labels[i];
|
|
46044
|
+
counts.set(lbl, (counts.get(lbl) ?? 0) + 1);
|
|
46045
|
+
}
|
|
46046
|
+
let bestLabel = labels[idx[0]];
|
|
46047
|
+
let bestCount = -1;
|
|
46048
|
+
for (const [lbl, count2] of counts) {
|
|
46049
|
+
if (count2 > bestCount) {
|
|
46050
|
+
bestCount = count2;
|
|
46051
|
+
bestLabel = lbl;
|
|
46052
|
+
}
|
|
46053
|
+
}
|
|
46054
|
+
const nearestLabel = labels[idx[0]];
|
|
46055
|
+
if (counts.get(nearestLabel) === bestCount) {
|
|
46056
|
+
bestLabel = nearestLabel;
|
|
46057
|
+
}
|
|
46058
|
+
return bestLabel;
|
|
46059
|
+
});
|
|
46060
|
+
}
|
|
46061
|
+
function knnRegress(train, targets, query, k) {
|
|
46062
|
+
return query.map((q) => {
|
|
46063
|
+
const idx = kNearestIndices(train, q, k);
|
|
46064
|
+
const sum3 = idx.reduce((acc, i) => acc + targets[i], 0);
|
|
46065
|
+
return sum3 / idx.length;
|
|
46066
|
+
});
|
|
46067
|
+
}
|
|
46068
|
+
|
|
46069
|
+
// src/ml/kde.ts
|
|
46070
|
+
var SQRT_2PI2 = Math.sqrt(2 * Math.PI);
|
|
46071
|
+
function standardNormalPdf(z) {
|
|
46072
|
+
return Math.exp(-0.5 * z * z) / SQRT_2PI2;
|
|
46073
|
+
}
|
|
46074
|
+
function sampleStd(samples, mean7) {
|
|
46075
|
+
const n = samples.length;
|
|
46076
|
+
let sumSq = 0;
|
|
46077
|
+
for (const s of samples) {
|
|
46078
|
+
const d = s - mean7;
|
|
46079
|
+
sumSq += d * d;
|
|
46080
|
+
}
|
|
46081
|
+
return Math.sqrt(sumSq / (n - 1));
|
|
46082
|
+
}
|
|
46083
|
+
function percentileSorted(sorted, p) {
|
|
46084
|
+
const n = sorted.length;
|
|
46085
|
+
if (n === 1) return sorted[0];
|
|
46086
|
+
const rank2 = p / 100 * (n - 1);
|
|
46087
|
+
const lo = Math.floor(rank2);
|
|
46088
|
+
const hi = Math.ceil(rank2);
|
|
46089
|
+
if (lo === hi) return sorted[lo];
|
|
46090
|
+
const frac = rank2 - lo;
|
|
46091
|
+
return sorted[lo] * (1 - frac) + sorted[hi] * frac;
|
|
46092
|
+
}
|
|
46093
|
+
function silvermanBandwidth(samples) {
|
|
46094
|
+
const n = samples.length;
|
|
46095
|
+
const mean7 = samples.reduce((a, b) => a + b, 0) / n;
|
|
46096
|
+
const sigma = sampleStd(samples, mean7);
|
|
46097
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
46098
|
+
const iqr2 = percentileSorted(sorted, 75) - percentileSorted(sorted, 25);
|
|
46099
|
+
const spread = iqr2 > 0 ? Math.min(sigma, iqr2 / 1.34) : sigma;
|
|
46100
|
+
if (spread === 0) {
|
|
46101
|
+
throw new Error(
|
|
46102
|
+
"gaussianKDE: cannot derive a Silverman bandwidth from a constant sample (standard deviation and IQR are both 0); pass an explicit `bandwidth`."
|
|
46103
|
+
);
|
|
46104
|
+
}
|
|
46105
|
+
return 0.9 * spread * Math.pow(n, -1 / 5);
|
|
46106
|
+
}
|
|
46107
|
+
function gaussianKDE(samples, opts = {}) {
|
|
46108
|
+
if (samples.length === 0) {
|
|
46109
|
+
throw new Error("gaussianKDE: `samples` must be non-empty.");
|
|
46110
|
+
}
|
|
46111
|
+
const bandwidth = opts.bandwidth ?? silvermanBandwidth(samples);
|
|
46112
|
+
if (!(bandwidth > 0)) {
|
|
46113
|
+
throw new Error("gaussianKDE: `bandwidth` must be a positive number.");
|
|
46114
|
+
}
|
|
46115
|
+
const n = samples.length;
|
|
46116
|
+
const evaluate3 = (xs) => xs.map((x) => {
|
|
46117
|
+
let sum3 = 0;
|
|
46118
|
+
for (const s of samples) {
|
|
46119
|
+
sum3 += standardNormalPdf((x - s) / bandwidth);
|
|
46120
|
+
}
|
|
46121
|
+
return sum3 / (n * bandwidth);
|
|
46122
|
+
});
|
|
46123
|
+
return { evaluate: evaluate3, bandwidth };
|
|
46124
|
+
}
|
|
46125
|
+
|
|
46126
|
+
// src/stats/inference-extra.ts
|
|
46127
|
+
function chi2Contingency(table, opts = {}) {
|
|
46128
|
+
const rows = table.length;
|
|
46129
|
+
if (rows < 2) throw new Error("chi2Contingency: table needs at least 2 rows");
|
|
46130
|
+
const cols = table[0].length;
|
|
46131
|
+
if (cols < 2) throw new Error("chi2Contingency: table needs at least 2 columns");
|
|
46132
|
+
for (const row2 of table) {
|
|
46133
|
+
if (row2.length !== cols) throw new Error("chi2Contingency: table must be rectangular");
|
|
46134
|
+
}
|
|
46135
|
+
const rowTotals = new Array(rows).fill(0);
|
|
46136
|
+
const colTotals = new Array(cols).fill(0);
|
|
46137
|
+
let total = 0;
|
|
46138
|
+
for (let i = 0; i < rows; i++) {
|
|
46139
|
+
for (let j = 0; j < cols; j++) {
|
|
46140
|
+
const v = table[i][j];
|
|
46141
|
+
rowTotals[i] += v;
|
|
46142
|
+
colTotals[j] += v;
|
|
46143
|
+
total += v;
|
|
46144
|
+
}
|
|
46145
|
+
}
|
|
46146
|
+
if (total <= 0) throw new Error("chi2Contingency: table sum must be positive");
|
|
46147
|
+
const expected = Array.from({ length: rows }, () => new Array(cols).fill(0));
|
|
46148
|
+
const applyCorrection = rows === 2 && cols === 2 && opts.correction !== false;
|
|
46149
|
+
let chi2 = 0;
|
|
46150
|
+
for (let i = 0; i < rows; i++) {
|
|
46151
|
+
for (let j = 0; j < cols; j++) {
|
|
46152
|
+
const e = rowTotals[i] * colTotals[j] / total;
|
|
46153
|
+
expected[i][j] = e;
|
|
46154
|
+
if (e <= 0) continue;
|
|
46155
|
+
const o = table[i][j];
|
|
46156
|
+
const diff2 = applyCorrection ? Math.max(0, Math.abs(o - e) - 0.5) : o - e;
|
|
46157
|
+
chi2 += diff2 * diff2 / e;
|
|
46158
|
+
}
|
|
46159
|
+
}
|
|
46160
|
+
const dof = (rows - 1) * (cols - 1);
|
|
46161
|
+
const pValue = 1 - chiSquaredCDF(chi2, dof);
|
|
46162
|
+
const cramersV = Math.sqrt(chi2 / (total * Math.min(rows - 1, cols - 1)));
|
|
46163
|
+
return { chi2, pValue, dof, expected, cramersV };
|
|
46164
|
+
}
|
|
46165
|
+
function multipleTest(pValues, method) {
|
|
46166
|
+
const n = pValues.length;
|
|
46167
|
+
if (n === 0) return [];
|
|
46168
|
+
if (method === "bonferroni") {
|
|
46169
|
+
return pValues.map((p) => Math.min(1, p * n));
|
|
46170
|
+
}
|
|
46171
|
+
const order = pValues.map((_, i) => i).sort((a, b) => pValues[a] - pValues[b]);
|
|
46172
|
+
const adjusted = new Array(n);
|
|
46173
|
+
if (method === "holm") {
|
|
46174
|
+
let running2 = 0;
|
|
46175
|
+
for (let rank2 = 0; rank2 < n; rank2++) {
|
|
46176
|
+
const idx = order[rank2];
|
|
46177
|
+
running2 = Math.max(running2, (n - rank2) * pValues[idx]);
|
|
46178
|
+
adjusted[idx] = Math.min(1, running2);
|
|
46179
|
+
}
|
|
46180
|
+
return adjusted;
|
|
46181
|
+
}
|
|
46182
|
+
let running = 1;
|
|
46183
|
+
for (let rank2 = n - 1; rank2 >= 0; rank2--) {
|
|
46184
|
+
const idx = order[rank2];
|
|
46185
|
+
running = Math.min(running, n / (rank2 + 1) * pValues[idx]);
|
|
46186
|
+
adjusted[idx] = Math.min(1, running);
|
|
46187
|
+
}
|
|
46188
|
+
return adjusted;
|
|
46189
|
+
}
|
|
46190
|
+
|
|
45695
46191
|
// src/numeric/bfgs.ts
|
|
45696
46192
|
var CBRT_EPS = Math.cbrt(2220446049250313e-31);
|
|
45697
46193
|
function numericGradient(f, x) {
|
|
@@ -45716,12 +46212,12 @@ function clipToBounds(x, bounds) {
|
|
|
45716
46212
|
return Math.min(hi, Math.max(lo, v));
|
|
45717
46213
|
});
|
|
45718
46214
|
}
|
|
45719
|
-
function
|
|
46215
|
+
function dot3(a, b) {
|
|
45720
46216
|
let s = 0;
|
|
45721
46217
|
for (let i = 0; i < a.length; i++) s += a[i] * b[i];
|
|
45722
46218
|
return s;
|
|
45723
46219
|
}
|
|
45724
|
-
function
|
|
46220
|
+
function matVec2(H, v) {
|
|
45725
46221
|
const n = v.length;
|
|
45726
46222
|
const out = new Array(n);
|
|
45727
46223
|
for (let i = 0; i < n; i++) {
|
|
@@ -45747,10 +46243,10 @@ function bfgs(f, x0, opts = {}) {
|
|
|
45747
46243
|
let iter = 0;
|
|
45748
46244
|
let converged = infNorm(g) < tol;
|
|
45749
46245
|
while (!converged && iter < maxIter) {
|
|
45750
|
-
const d =
|
|
45751
|
-
const gd =
|
|
46246
|
+
const d = matVec2(H, g).map((v) => -v);
|
|
46247
|
+
const gd = dot3(g, d);
|
|
45752
46248
|
const dir = gd < 0 ? d : g.map((v) => -v);
|
|
45753
|
-
const dirSlope = gd < 0 ? gd : -
|
|
46249
|
+
const dirSlope = gd < 0 ? gd : -dot3(g, g);
|
|
45754
46250
|
let alpha = 1;
|
|
45755
46251
|
let xNew = clipToBounds(
|
|
45756
46252
|
x.map((v, i) => v + alpha * dir[i]),
|
|
@@ -45770,11 +46266,11 @@ function bfgs(f, x0, opts = {}) {
|
|
|
45770
46266
|
const gNew = gradOf(xNew);
|
|
45771
46267
|
const s = xNew.map((v, i) => v - x[i]);
|
|
45772
46268
|
const y = gNew.map((v, i) => v - g[i]);
|
|
45773
|
-
const sy =
|
|
46269
|
+
const sy = dot3(s, y);
|
|
45774
46270
|
if (sy > 1e-12) {
|
|
45775
46271
|
const rho = 1 / sy;
|
|
45776
|
-
const Hy =
|
|
45777
|
-
const yHy =
|
|
46272
|
+
const Hy = matVec2(H, y);
|
|
46273
|
+
const yHy = dot3(y, Hy);
|
|
45778
46274
|
const HNew = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
45779
46275
|
for (let i = 0; i < n; i++) {
|
|
45780
46276
|
for (let j = 0; j < n; j++) {
|
|
@@ -45793,7 +46289,7 @@ function bfgs(f, x0, opts = {}) {
|
|
|
45793
46289
|
}
|
|
45794
46290
|
|
|
45795
46291
|
// src/numeric/nnls.ts
|
|
45796
|
-
function
|
|
46292
|
+
function matVec3(A, x) {
|
|
45797
46293
|
const m = A.length;
|
|
45798
46294
|
const result = new Array(m);
|
|
45799
46295
|
for (let i = 0; i < m; i++) {
|
|
@@ -45805,7 +46301,7 @@ function matVec2(A, x) {
|
|
|
45805
46301
|
return result;
|
|
45806
46302
|
}
|
|
45807
46303
|
function residualNorm(A, x, b) {
|
|
45808
|
-
const Ax =
|
|
46304
|
+
const Ax = matVec3(A, x);
|
|
45809
46305
|
let s = 0;
|
|
45810
46306
|
for (let i = 0; i < b.length; i++) {
|
|
45811
46307
|
const d = Ax[i] - b[i];
|
|
@@ -45821,7 +46317,7 @@ function nnls(A, b, opts = {}) {
|
|
|
45821
46317
|
let x = new Array(n).fill(0);
|
|
45822
46318
|
const passive = /* @__PURE__ */ new Set();
|
|
45823
46319
|
const gradient2 = (xv) => {
|
|
45824
|
-
const Ax =
|
|
46320
|
+
const Ax = matVec3(A, xv);
|
|
45825
46321
|
const w = new Array(n).fill(0);
|
|
45826
46322
|
for (let j = 0; j < n; j++) {
|
|
45827
46323
|
let s = 0;
|
|
@@ -45889,7 +46385,7 @@ function lsqBounded(A, b, lower, upper, opts = {}) {
|
|
|
45889
46385
|
const maxIter = opts.maxIter ?? Math.max(200, 20 * n);
|
|
45890
46386
|
let x = clip(new Array(n).fill(0), lower, upper);
|
|
45891
46387
|
const gradient2 = (xv) => {
|
|
45892
|
-
const Ax =
|
|
46388
|
+
const Ax = matVec3(A, xv);
|
|
45893
46389
|
const r = new Array(m);
|
|
45894
46390
|
for (let i = 0; i < m; i++) r[i] = Ax[i] - b[i];
|
|
45895
46391
|
const g = new Array(n).fill(0);
|
|
@@ -46197,15 +46693,15 @@ function haversine(lat1, lon1, lat2, lon2, radius = EARTH_RADIUS_KM) {
|
|
|
46197
46693
|
const a = Math.sin(dPhi / 2) ** 2 + Math.cos(phi1) * Math.cos(phi2) * Math.sin(dLambda / 2) ** 2;
|
|
46198
46694
|
return radius * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
46199
46695
|
}
|
|
46200
|
-
var
|
|
46201
|
-
var norm3 = (a) => Math.sqrt(
|
|
46696
|
+
var dot4 = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);
|
|
46697
|
+
var norm3 = (a) => Math.sqrt(dot4(a, a));
|
|
46202
46698
|
function slerp(v0, v1, t) {
|
|
46203
46699
|
const n0 = norm3(v0);
|
|
46204
46700
|
const n16 = norm3(v1);
|
|
46205
46701
|
if (n0 === 0 || n16 === 0) throw new Error("slerp: input vectors must be non-zero");
|
|
46206
46702
|
const u0 = v0.map((v) => v / n0);
|
|
46207
46703
|
const u1 = v1.map((v) => v / n16);
|
|
46208
|
-
let cos2 =
|
|
46704
|
+
let cos2 = dot4(u0, u1);
|
|
46209
46705
|
cos2 = cos2 > 1 ? 1 : cos2 < -1 ? -1 : cos2;
|
|
46210
46706
|
const omega = Math.acos(cos2);
|
|
46211
46707
|
const mag = n0 + (n16 - n0) * t;
|
|
@@ -46362,6 +46858,7 @@ export {
|
|
|
46362
46858
|
chebyshevDistance,
|
|
46363
46859
|
chebyshevFit,
|
|
46364
46860
|
chebyshevT,
|
|
46861
|
+
chi2Contingency,
|
|
46365
46862
|
chiSquareTest,
|
|
46366
46863
|
chiSquaredCDF,
|
|
46367
46864
|
chiSquaredDist,
|
|
@@ -46436,6 +46933,7 @@ export {
|
|
|
46436
46933
|
curl,
|
|
46437
46934
|
curvefit,
|
|
46438
46935
|
dagostinoTest,
|
|
46936
|
+
dbscan,
|
|
46439
46937
|
dct,
|
|
46440
46938
|
deepEqual,
|
|
46441
46939
|
degree,
|
|
@@ -46476,6 +46974,7 @@ export {
|
|
|
46476
46974
|
efimovFactor,
|
|
46477
46975
|
eigenvectorCentrality,
|
|
46478
46976
|
eigs,
|
|
46977
|
+
elasticNet,
|
|
46479
46978
|
electricConstant,
|
|
46480
46979
|
electronMass,
|
|
46481
46980
|
element,
|
|
@@ -46623,6 +47122,7 @@ export {
|
|
|
46623
47122
|
gammaincp,
|
|
46624
47123
|
gasConstant,
|
|
46625
47124
|
gaussQuad,
|
|
47125
|
+
gaussianKDE,
|
|
46626
47126
|
gcd,
|
|
46627
47127
|
generalizedEig,
|
|
46628
47128
|
geometricPMF,
|
|
@@ -46715,6 +47215,8 @@ export {
|
|
|
46715
47215
|
kldivergence,
|
|
46716
47216
|
klitzing,
|
|
46717
47217
|
kmeans,
|
|
47218
|
+
knnClassify,
|
|
47219
|
+
knnRegress,
|
|
46718
47220
|
kolmogorovSmirnov2Test,
|
|
46719
47221
|
kolmogorovSmirnovTest,
|
|
46720
47222
|
kron,
|
|
@@ -46731,6 +47233,7 @@ export {
|
|
|
46731
47233
|
laplacianMatrix,
|
|
46732
47234
|
larger,
|
|
46733
47235
|
largerEq,
|
|
47236
|
+
lasso,
|
|
46734
47237
|
lcm,
|
|
46735
47238
|
leafCount,
|
|
46736
47239
|
leastSquares,
|
|
@@ -46760,6 +47263,7 @@ export {
|
|
|
46760
47263
|
logisticCDF,
|
|
46761
47264
|
logisticPDF,
|
|
46762
47265
|
logisticQuantile,
|
|
47266
|
+
logisticRegression,
|
|
46763
47267
|
logsumexp,
|
|
46764
47268
|
loschmidt,
|
|
46765
47269
|
lowRankApprox,
|
|
@@ -46819,6 +47323,7 @@ export {
|
|
|
46819
47323
|
multiTaperPSD,
|
|
46820
47324
|
multinomial,
|
|
46821
47325
|
multipleComparison,
|
|
47326
|
+
multipleTest,
|
|
46822
47327
|
multiply,
|
|
46823
47328
|
multiplyScalar,
|
|
46824
47329
|
multivariateNormal,
|
|
@@ -46854,6 +47359,7 @@ export {
|
|
|
46854
47359
|
oct,
|
|
46855
47360
|
odeAdaptiveStep,
|
|
46856
47361
|
odeGeneral,
|
|
47362
|
+
ols,
|
|
46857
47363
|
ones,
|
|
46858
47364
|
or,
|
|
46859
47365
|
orth,
|
|
@@ -46972,6 +47478,7 @@ export {
|
|
|
46972
47478
|
resolve,
|
|
46973
47479
|
resultant,
|
|
46974
47480
|
reviver,
|
|
47481
|
+
ridge,
|
|
46975
47482
|
rightArithShift,
|
|
46976
47483
|
rightLogShift,
|
|
46977
47484
|
risingFactorial,
|