UNPKG

@ai-on-browser/data-analysis-models

Version:

Data analysis model package without any dependencies

57 lines (51 loc) 1.25 kB
import Matrix from '../util/matrix.js' /** * Recursive least squares */ export default class RecursiveLeastSquares { // https://en.wikipedia.org/wiki/Online_machine_learning constructor() { this._w = null this._s = null } /** * Update model parameters with one data. * @param {Matrix} x Training data * @param {number} y Target value */ update(x, y) { const ds = this._s.dot(x).dot(x.tDot(this._s)) ds.div(1 + x.tDot(this._s).dot(x).toScaler()) this._s.sub(ds) const dw = this._s.dot(x) dw.mult(x.tDot(this._w).toScaler() - y) this._w.sub(dw) } /** * Fit model. * @param {Array<Array<number>>} x Training data * @param {number[]} y Target values */ fit(x, y) { x = Matrix.fromArray(x) const xh = Matrix.resize(x, x.rows, x.cols + 1, 1) if (!this._w) { this._w = Matrix.zeros(xh.cols, 1) this._s = Matrix.eye(xh.cols, xh.cols) } for (let i = 0; i < x.rows; i++) { this.update(xh.row(i).t, y[i]) } } /** * Returns predicted datas. * @param {Array<Array<number>>} data Sample data * @returns {number[]} Predicted values */ predict(data) { const x = Matrix.fromArray(data) const xh = Matrix.resize(x, x.rows, x.cols + 1, 1) const r = xh.dot(this._w) return r.value } }