当前位置:首页 > 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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现变形

js实现变形

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