Matrix operations, decompositions, and linear system solvers
The Linear Algebra (linalg) module provides comprehensive matrix operations, decompositions, and linear system solvers. It’s essential for scientific computing, machine learning, and numerical analysis.
import { qr } from 'deepbox/linalg';const A = tensor([[1, 2], [3, 4], [5, 6]]);const { Q, R } = qr(A);// A = Q @ R// Q is orthogonal, R is upper triangularconsole.log(Q.shape); // [3, 2]console.log(R.shape); // [2, 2]
import { lu } from 'deepbox/linalg';const A = tensor([[4, 3], [6, 3]]);const { P, L, U } = lu(A);// P @ A = L @ U// P is permutation, L is lower triangular, U is upper triangular
import { cholesky } from 'deepbox/linalg';// For positive definite matricesconst A = tensor([[4, 2], [2, 3]]);const L = cholesky(A);// A = L @ L^Tconsole.log(L); // Lower triangular
import { solve } from 'deepbox/linalg';import { tensor } from 'deepbox/ndarray';// Solve Ax = bconst A = tensor([[3, 1], [1, 2]]);const b = tensor([9, 8]);const x = solve(A, b);console.log(x); // [2, 3]// Verify: A @ x ≈ b
import { solveTriangular } from 'deepbox/linalg';// Solve triangular system (faster than general solver)const L = tensor([[2, 0], [3, 4]]);const b = tensor([4, 10]);// Lower triangularconst x = solveTriangular(L, b, { lower: true });
import { lstsq } from 'deepbox/linalg';import { tensor } from 'deepbox/ndarray';// X is design matrix, y is targetconst X = tensor([[1, 1], [1, 2], [1, 3]]);const y = tensor([2, 4, 6]);// Solve for coefficients: X @ beta = yconst { x: beta } = lstsq(X, y);console.log(beta); // [0, 2] (intercept and slope)
Principal Component Analysis
Use SVD for dimensionality reduction:
import { svd } from 'deepbox/linalg';import { tensor } from 'deepbox/ndarray';// Centered data matrixconst X = tensor([ [2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2]]);const { U, S, Vt } = svd(X);// Principal components are columns of V (rows of Vt)// Project data: X_reduced = U @ diag(S)
Numerical Stability
Check condition number before solving:
import { cond, solve, lstsq } from 'deepbox/linalg';const A = tensor([[1, 2], [3, 4]]);const b = tensor([5, 6]);const condNumber = cond(A);if (condNumber < 1e10) { // Well-conditioned, use direct solver const x = solve(A, b);} else { // Ill-conditioned, use least squares or regularization const { x } = lstsq(A, b);}
Use specialized functions for symmetric matrices (eigh instead of eig) for better performance and accuracy.
For solving multiple systems with the same A matrix, consider computing the decomposition once and reusing it.
Check the condition number before solving linear systems. High condition numbers indicate ill-conditioned problems that may produce inaccurate results.