如何用JS实现多项式回归

629 阅读1分钟

多项式回归是一种回归分析方法,它通过多项式函数来拟合数据。在JS中可以使用最小二乘法来实现多项式回归,以下是实现的步骤:

  1. 定义多项式函数

首先需要定义多项式函数。多项式函数可以表示为以下形式:

function polynomial(x, coefficients) {
  return coefficients.reduce((sum, coefficient, index) => {
    return sum + coefficient * Math.pow(x, index);
  }, 0);
}

其中,x是自变量,coefficients是多项式系数的数组。该函数使用reduce方法将多项式系数与自变量的幂次相乘,并将它们相加。

  1. 计算多项式系数

其次需要计算多项式系数。假设想要拟合一个三次多项式,可以使用以下代码计算多项式系数:

function polynomialRegression(xValues, yValues, degree) {
  let coefficients = [];
  let matrix = [];

  for (let i = 0; i <= degree; i++) {
    let row = [];
    for (let j = 0; j <= degree; j++) {
      let sum = 0;
      for (let k = 0; k < xValues.length; k++) {
        sum += Math.pow(xValues[k], i + j);
      }
      row.push(sum);
    }
    coefficients.push(0);
    matrix.push(row);
  }

  for (let i = 0; i <= degree; i++) {
    let sum = 0;
    for (let j = 0; j < yValues.length; j++) {
      sum += yValues[j] * Math.pow(xValues[j], i);
    }
    coefficients[i] = sum;
  }

  return solve(matrix, coefficients);
}

其中,xValues是自变量的数组,yValues是因变量的数组,degree是多项式的次数。该函数使用嵌套循环计算多项式系数的矩阵,并使用高斯消元法求解线性方程组。

  1. 解决线性方程组

最后,需要解决线性方程组。可以使用以下代码实现高斯消元法:

function solve(matrix, vector) {
  let n = vector.length;

  for (let i = 0; i < n; i++) {
    let maxRow = i;
    for (let j = i + 1; j < n; j++) {
      if (Math.abs(matrix[j][i]) > Math.abs(matrix[maxRow][i])) {
        maxRow = j;
      }
    }

    let temp = matrix[i];
    matrix[i] = matrix[maxRow];
    matrix[maxRow] = temp;

    temp = vector[i];
    vector[i] = vector[maxRow];
    vector[maxRow] = temp;

    for (let j = i + 1; j < n; j++) {
      let factor = matrix[j][i] / matrix[i][i];
      vector[j] -= factor * vector[i];
      for (let k = i; k < n; k++) {
        matrix[j][k] -= factor * matrix[i][k];
      }
    }
  }

  let solution = new Array(n);
  for (let i = n - 1; i >= 0; i--) {
    let sum = 0;
    for (let j = i + 1; j < n; j++) {
      sum += matrix[i][j] * solution[j];
    }
    solution[i] = (vector[i] - sum) / matrix[i][i];
  }

  return solution;
}

该函数使用高斯消元法求解线性方程组,其中matrix是系数矩阵,vector是常量向量。

现在,已经实现了多项式回归的三个步骤。可以使用以下代码将它们组合在一起:

let xValues = [1, 2, 3, 4, 5];
let yValues = [1, 4, 9, 16, 25];
let degree = 2;

let coefficients = polynomialRegression(xValues, yValues, degree);

console.log(coefficients); // [1.000000000000003, -3.552713678800501e-15, 1.0000000000000129]

let x = 6;
let y = polynomial(x, coefficients);

console.log(y); // 36.00000000000003