线性回归
从给定的一组数据点中,线性回归找到一条直线的方程。给定的点将遵循直线。使用此公式,我们可以预测当前不在集合中的其他特定点的值。
要使用一些数据点解决线性回归问题,我们必须遵循以下公式
这里的 m 和 c 分别是斜率和 y 截距。使用这些表达式,我们可以在此形式下得到直线方程:𝑦 = 𝑚𝑥 + 𝑐。
输入和输出
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
算法
linReg(coord)
输入:给定的坐标点集合。
输出:斜率 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
示例
#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; }
输出
The slope: 1.2 The Intercept: 1.6 The equation: y = 1.2x + 1.6
广告