最小二乘法化简后的公式如下图所示
C代码
/* y=kx+b
* double x[] X点位数组
* double y[] Y点位数组
* double *slope 斜率 k
* double *intercept 截距 b
*
*/
void leastSquare(int n, double x[], double y[], double *slope, double *intercept)
{
//sumX X[i]数组数据求和
//sumY Y[i]数组数据求和
//sumXY X[i]*Y[i]数组数据求和
//sumXX X[i]*X[i]数组数据求和
double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
// 计算各项和
for (int i = 0; i < n; i++)
{
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
}
// 计算斜率和截距
double sumX_average = sumX / n; //X数组数据求和后的平均值
double sumY_average = sumY / n; //Y数组数据求和后的平均值
double numerator = sumXY - n * sumX_average* sumY_average; //上图分子
double denominator = sumXX - n * sumX_average* sumX_average;//上图分母
*slope = numerator / denominator; //斜率
*intercept = meanY - (*slope) * meanX; //截距
}
得到的公式就是“ Y = *slope X + *intercept”