参考博客:https://blog.youkuaiyun.com/ccnt_2012/article/details/81127117
最小二乘法的应用:
考虑一个问题:给你二维平面中n个点的坐标(xi, yi),求一条直线,使所有点到这条直线的距离之和最小。
最小二乘法就是解决此类问题的。
步骤:
设要求的直线的参数方程为 ,要求的结果是
,未知量有两个为a和b
要使S最小,由二元微分方程可知,满足下列条件时函数取最小值:
等价于下面的式子:
解得:
,
即直线表达式为:
扩展:
若点集不变也可求使得距离之和最小得二次曲线方程,只是求偏微分方程时略有不同。
也可将点击扩展到三位空间,二元偏微分方程扩展成三元。同理也可扩展到n维,此时就要借用线性代数求解。
代码:
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005;
struct P{
double x, y;
P(){}
P(double _x, double _y){x = _x; y = _y;}
};
int main(){
int n; P a[N];
while(cin >> n){
for(int i=1; i<=n; i++) cin >> a[i].x >> a[i].y;
double A, B, C, D;
A = B = C = D = 0;
for(int i=1; i<=n; i++){
A += a[i].x;
B += a[i].y;
C += a[i].x*a[i].x;
D += a[i].x*a[i].y;
}
//printf("A=%f B=%f C=%f D=%f\n", A, B, C, D);
printf("y = %fx + %f\n", (A*B-n*D)/(A*A-n*C), (A*D-B*C)/(A*A-n*C));
}
}