本文主要是介绍最小二乘法(求距点集中的所有点距和最小得直线方程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考博客:https://blog.csdn.net/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));}
}
这篇关于最小二乘法(求距点集中的所有点距和最小得直线方程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!