Từ một tập hợp các điểm dữ liệu đã cho, hồi quy tuyến tính tìm ra một phương trình của đường thẳng. Các điểm đã cho sẽ đi theo đường thẳng. Sử dụng công thức này, chúng tôi có thể dự đoán đâu sẽ là giá trị cho một số điểm cụ thể khác, điểm này hiện không có trong tập hợp.
Để giải các bài toán hồi quy tuyến tính bằng cách sử dụng một số điểm dữ liệu, chúng ta phải làm theo các công thức sau:
Ở đây m và c lần lượt là hệ số góc và giao điểm y. Sử dụng các biểu thức này, chúng ta có thể nhận được phương trình của đường thẳng ở dạng sau:𝑦 =𝑚𝑥 + 𝑐.
Đầu vào và Đầu ra
Input: The (x, y) coordinates of some points. {(1,3), (2,4), (3,5), (4,6), (5,8)} Output: The slope: 1.2 The Intercept: 1.6 The equation: 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.
Đầu ra: Hệ số góc m và giao điểm 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ụ
#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]; //sum of x sy += coord[i][1]; //sum of y sx2 += coord[i][0]*coord[i][0]; //sum of x^2 sxy += coord[i][0]*coord[i][1]; //sum of x*y } // finding slope and intercept m = (N*sxy-(sx*sy))/(N*sx2-(sx*sx)); c = (sy/N)-(m*sx)/N; } main() { // this 2d array holds coordinate points 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; }
Đầu ra
The slope: 1.2 The Intercept: 1.6 The equation: y = 1.2x + 1.6