用js实现线性回归
实现线性回归的基本原理
线性回归通过最小化预测值与真实值之间的平方误差(最小二乘法),拟合出最佳直线方程 $y = mx + b$。在JavaScript中可以通过以下步骤实现:
计算斜率和截距
斜率 $m$ 和截距 $b$ 的计算公式如下: $$ m = \frac{n\sum xy - (\sum x)(\sum y)}{n\sum x^2 - (\sum x)^2} $$ $$ b = \frac{\sum y - m \sum x}{n} $$

function linearRegression(x, y) {
const n = x.length;
let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
for (let i = 0; i < n; i++) {
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
}
const m = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
const b = (sumY - m * sumX) / n;
return { m, b };
}
使用示例
const x = [1, 2, 3, 4, 5];
const y = [2, 4, 5, 4, 5];
const { m, b } = linearRegression(x, y);
console.log(`回归方程: y = ${m}x + ${b}`); // 输出如 y = 0.6x + 2.2
预测新数据点
利用拟合的方程进行预测:
function predict(x, m, b) {
return m * x + b;
}
console.log(predict(6, m, b)); // 预测x=6时的y值
可视化实现(可选)
结合Canvas或图表库(如Chart.js)绘制数据点和回归线:

const ctx = document.getElementById('chart').getContext('2d');
new Chart(ctx, {
type: 'scatter',
data: {
datasets: [{
label: '原始数据',
data: x.map((val, i) => ({x: val, y: y[i]})),
backgroundColor: 'red'
}, {
label: '回归线',
data: [{x: Math.min(...x), y: predict(Math.min(...x), m, b)},
{x: Math.max(...x), y: predict(Math.max(...x), m, b)}],
type: 'line',
borderColor: 'blue'
}]
}
});
性能优化
对于大数据集,可使用矩阵运算库(如math.js)加速计算:
const math = require('mathjs');
function matrixRegression(x, y) {
const X = math.concat(math.ones([x.length, 1]), math.transpose([x]));
const coeff = math.multiply(
math.multiply(math.inv(math.multiply(math.transpose(X), X)), math.transpose(X)),
y
);
return { m: coeff[1], b: coeff[0] };
}
注意事项:
- 输入数组x和y的长度需一致
- 极端值(如全零)可能导致计算错误
- 对于非线性数据,需考虑多项式回归或其他模型






