Cho tập điểm (xᵢ, yᵢ), tìm đường thẳng y = mx + c khớp nhất (hồi quy tuyến tính least squares). Ví dụ:
Input: 4 điểm (2,3), (5,6), (1,3), (4,5) Output: m = 0.8, c = 1.85 Input: 3 điểm (3,6), (2,4), (1,3) Output: m = 1.5, c = 1.33
Cách tiếp cận
Tối thiểu hóa tổng bình phương sai số Z = Σ(fᵢ - yᵢ)² với fᵢ = mxᵢ + c. Giải hệ đạo hàm = 0 cho ra công thức:
m = (n·Σxy - Σx·Σy) / (n·Σx² - (Σx)²) c = (Σy - m·Σx) / n
Ví dụ
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int X[] = { 3, 2, 1 };
int Y[] = { 6, 4, 3 };
int n = sizeof(X) / sizeof(X[0]);
float m, c;
int sumX = 0, sumX2 = 0, sumY = 0, sumXY = 0;
for (int i = 0; i < n; i++) {
sumX += X[i];
sumX2 += pow(X[i], 2);
sumY += Y[i];
sumXY += X[i] * Y[i];
}
m = (n * sumXY - sumX * sumY) / (n * sumX2 - pow(sumX, 2));
c = (sumY - m * sumX) / n;
cout << "m = " << m << "\nc = " << c;
return 0;
}
Kết quả
m = 1.5 c = 1.33333
Kết luận
Tìm đường thẳng hồi quy tuyến tính (least squares) cho tập điểm bằng công thức giải tích. Code C++ O(n).