当前位置:首页 > JavaScript

js实现线性回归

2026-02-03 08:47:23JavaScript

线性回归的数学原理

线性回归模型的基本形式为: $$ y = w \cdot x + b $$

其中:

  • $y$ 是预测值
  • $x$ 是特征值
  • $w$ 是权重(斜率)
  • $b$ 是偏置(截距)

损失函数(均方误差): $$ L(w, b) = \frac{1}{2n} \sum_{i=1}^n (y_i - (w \cdot x_i + b))^2 $$

js实现线性回归

梯度下降实现

使用梯度下降法更新参数: $$ w := w - \alpha \cdot \frac{\partial L}{\partial w} $$ $$ b := b - \alpha \cdot \frac{\partial L}{\partial b} $$

偏导数计算: $$ \frac{\partial L}{\partial w} = -\frac{1}{n} \sum_{i=1}^n x_i (y_i - (w \cdot xi + b)) $$ $$ \frac{\partial L}{\partial b} = -\frac{1}{n} \sum{i=1}^n (y_i - (w \cdot x_i + b)) $$

js实现线性回归

JavaScript实现代码

class LinearRegression {
  constructor(learningRate = 0.01, iterations = 1000) {
    this.learningRate = learningRate;
    this.iterations = iterations;
    this.weights = null;
    this.bias = 0;
  }

  fit(X, y) {
    const n = X.length;
    const d = X[0].length;
    this.weights = Array(d).fill(0);

    for (let iter = 0; iter < this.iterations; iter++) {
      let gradW = Array(d).fill(0);
      let gradB = 0;

      for (let i = 0; i < n; i++) {
        const error = this.predict(X[i]) - y[i];

        for (let j = 0; j < d; j++) {
          gradW[j] += (1/n) * X[i][j] * error;
        }
        gradB += (1/n) * error;
      }

      for (let j = 0; j < d; j++) {
        this.weights[j] -= this.learningRate * gradW[j];
      }
      this.bias -= this.learningRate * gradB;
    }
  }

  predict(x) {
    let result = this.bias;
    for (let i = 0; i < x.length; i++) {
      result += x[i] * this.weights[i];
    }
    return result;
  }
}

// 使用示例
const X = [[1], [2], [3], [4]];  // 特征
const y = [2, 4, 6, 8];          // 标签

const model = new LinearRegression();
model.fit(X, y);

console.log(model.predict([5]));  // 预测结果接近10

使用矩阵运算优化

对于大数据集,可以使用矩阵运算提高效率:

class MatrixLinearRegression {
  constructor(learningRate = 0.01, iterations = 1000) {
    this.learningRate = learningRate;
    this.iterations = iterations;
    this.weights = null;
  }

  fit(X, y) {
    // 添加偏置列
    X = X.map(x => [1, ...x]);
    const n = X.length;
    const d = X[0].length;

    // 初始化权重
    this.weights = Array(d).fill(0);

    for (let iter = 0; iter < this.iterations; iter++) {
      // 计算预测值
      const predictions = X.map(x => {
        return x.reduce((sum, xi, i) => sum + xi * this.weights[i], 0);
      });

      // 计算梯度
      const errors = predictions.map((p, i) => p - y[i]);
      const gradients = Array(d).fill(0);

      for (let j = 0; j < d; j++) {
        gradients[j] = (1/n) * errors.reduce(
          (sum, err, i) => sum + err * X[i][j], 0
        );
      }

      // 更新权重
      for (let j = 0; j < d; j++) {
        this.weights[j] -= this.learningRate * gradients[j];
      }
    }
  }

  predict(x) {
    x = [1, ...x];
    return x.reduce((sum, xi, i) => sum + xi * this.weights[i], 0);
  }
}

使用现成库实现

推荐使用ml.js库实现更完整的线性回归:

// 安装:npm install ml-regression
const { LinearRegression } = require('ml-regression');

const X = [1, 2, 3, 4];
const y = [2, 4, 6, 8];

const regression = new LinearRegression(X, y);
console.log(regression.predict(5));  // 10
console.log(regression.toString(3)); // 显示模型方程

标签: 线性js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…