Giới thiệu
Từ một tập hợp các điểm dữ liệu cho trước, hồi quy tuyến tính tìm phương trình của một đường thẳng. Các điểm cho trước sẽ tuân theo đường thẳng này. Sử dụng công thức này, ta có thể dự đoán giá trị cho một số điểm cụ thể khác, chưa có trong tập dữ liệu hiện tại.
Để giải bài toán hồi quy tuyến tính bằng một số điểm dữ liệu, ta phải tuân theo các công thức sau:

Ở đây m và c lần lượt là độ dốc và điểm cắt trục y. Sử dụng các biểu thức này, ta có thể được phương trình đường thẳng dưới dạng: y = mx + c.
Đầu vào và Đầu ra
Đầu vào: Tọa độ (x, y) của một số điểm. {(1,3), (2,4), (3,5), (4,6), (5,8)}
Đầu ra: Độ dốc: 1.2; Điểm cắt: 1.6; Phương trình: y = 1.2x + 1.6
Thuật toán
linReg(coord)
Đầu vào: Tập hợp các điểm tọa độ cho trước.
Đầu ra: Độ dốc m và điểm cắt trục y c.
Begin
for i := 1 to n, do
sumX := sumX + coord[i,0]
sumY := sumY + coord[i,1]
sumXsq := sumXsq + (coord[i,0]*coord[i,0])
sumXY := sumXY + (coord[i,0] * coord[i,1])
done
m := (n * sumXY – (sumX*sumY)) / (n * sumXsq – (sumX * sumX))
c := (sumY / n) – (m * sumX)/n
End
Ví dụ (C++)
#include <iostream>
#include <cmath>
#define N 5
using namespace std;
void linReg(int coord[N][2], float &m, float &c) {
float sx2 = 0, sx = 0, sxy = 0, sy = 0;
for(int i = 0; i < N; i++) {
sx += coord[i][0]; // tổng x
sy += coord[i][1]; // tổng y
sx2 += coord[i][0]*coord[i][0]; // tổng x^2
sxy += coord[i][0]*coord[i][1]; // tổng x*y
}
// tìm độ dốc và điểm cắt
m = (N*sxy-(sx*sy))/(N*sx2-(sx*sx));
c = (sy/N)-(m*sx)/N;
}
main() {
// mảng 2D này lưu các điểm tọa độ
int point[N][2] = {{1,3},{2,4},{3,5},{4,6},{5,8}};
float m, c;
linReg(point, m, c);
cout << "The slope: " << m << " The Intercept: " << c << endl;
cout << "The equation: " << "y = "<< m <<"x + "<< c;
}
Kết quả
The slope: 1.2 The Intercept: 1.6 The equation: y = 1.2x + 1.6