Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm đường thẳng hồi quy tuyến tính phù hợp nhất cho tập điểm bằng C++


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).