当前位置:首页 > JavaScript

js实现多远

2026-03-15 02:54:45JavaScript

JavaScript 实现多元线性回归

在JavaScript中实现多元线性回归,可以通过矩阵运算库(如math.js)或手动实现最小二乘法。以下是两种常见方法:

使用数学库实现

安装math.js库:

npm install mathjs

代码示例:

const math = require('mathjs');

function multipleLinearRegression(X, y) {
  // 添加截距项(全1列)
  const X_with_intercept = X.map(row => [1, ...row]);

  // 计算 (X'X)^-1 X'y
  const XT = math.transpose(X_with_intercept);
  const XTX = math.multiply(XT, X_with_intercept);
  const XTX_inv = math.inv(XTX);
  const XTy = math.multiply(XT, y);
  const coefficients = math.multiply(XTX_inv, XTy);

  return coefficients;
}

// 示例数据:2个特征
const X = [
  [1, 2],
  [2, 3],
  [3, 4]
];
const y = [3, 5, 7];

const beta = multipleLinearRegression(X, y);
console.log('系数:', beta); // 包括截距和斜率

手动实现最小二乘法

对于小型数据集,可以手动实现矩阵运算:

function matrixMultiply(A, B) {
  return A.map((row, i) => 
    B[0].map((_, j) => 
      row.reduce((sum, val, k) => sum + val * B[k][j], 0)
    )
  );
}

function transpose(matrix) {
  return matrix[0].map((_, i) => matrix.map(row => row[i]));
}

function linearRegression(X, y) {
  const X_with_intercept = X.map(row => [1, ...row]);
  const XT = transpose(X_with_intercept);
  const XTX = matrixMultiply(XT, X_with_intercept);

  // 简单求逆(仅适用于小矩阵)
  const det = XTX[0][0] * XTX[1][1] - XTX[0][1] * XTX[1][0];
  const XTX_inv = [
    [XTX[1][1]/det, -XTX[0][1]/det],
    [-XTX[1][0]/det, XTX[0][0]/det]
  ];

  const XTy = matrixMultiply(XT, y.map(val => [val]));
  return matrixMultiply(XTX_inv, XTy);
}

使用梯度下降

对于大规模数据,梯度下降更高效:

js实现多远

function gradientDescent(X, y, learningRate = 0.01, epochs = 1000) {
  const n = X.length;
  const m = X[0].length;
  let beta = Array(m + 1).fill(0); // 包括截距

  for (let epoch = 0; epoch < epochs; epoch++) {
    const gradients = Array(m + 1).fill(0);

    for (let i = 0; i < n; i++) {
      const prediction = beta[0] + X[i].reduce((sum, val, j) => sum + val * beta[j + 1], 0);
      const error = prediction - y[i];

      gradients[0] += error;
      X[i].forEach((val, j) => {
        gradients[j + 1] += error * val;
      });
    }

    beta = beta.map((val, j) => val - (learningRate / n) * gradients[j]);
  }

  return beta;
}

注意事项

  • 数据标准化:对于特征量纲差异大的情况,应先标准化数据
  • 多重共线性:高相关性的特征会导致矩阵求逆不稳定
  • 正则化:可添加L1/L2正则项防止过拟合

以上方法可根据具体需求选择,数学库实现适合精确解,梯度下降适合大规模数据。

标签: 多远js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现全选

js实现全选

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

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…