最小二乘法(求距点集中的所有点距和最小得直线方程)

本文详细介绍了最小二乘法的基本原理及其在求解线性拟合问题中的应用,通过数学公式推导了直线最佳拟合的计算方法,并提供了C++实现代码,适用于处理多维空间中的数据拟合问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:https://blog.youkuaiyun.com/ccnt_2012/article/details/81127117

最小二乘法的应用:

考虑一个问题:给你二维平面中n个点的坐标(xi, yi),求一条直线,使所有点到这条直线的距离之和最小。

最小二乘法就是解决此类问题的。

步骤:

设要求的直线的参数方程为 f(x) = ax+b,要求的结果是S = \sum_{i=1}^{n} (f(x)-y_{i})^{2} = \sum_{i=1}^{n} (ax_{i}+b-y_{i})^{2},未知量有两个为a和b

要使S最小,由二元微分方程可知,满足下列条件时函数取最小值:

f_{a}^{`}(a, b) = \frac{\partial S }{\partial a} = 2\sum (ax_{i}+b-y_{i})x_{i} = 2(a\sum x_{i}^{2} + b\sum x_{i} - \sum x_{i} y_{i}) = 0

f_{b}^{`}(a, b) = \frac{\partial S }{\partial b} =2 \sum (ax_{i}+b-y_{i}) = 2(a\sum x_{i} + b\sum 1 - \sum y_{i} ) = 0

等价于下面的式子:

Cx+Ay-D=0 (C = \sum x_{i}^{2},A=\sum x_{i} ,D = \sum x_{i}y_{i})  

Ax + Ny - B = 0 (A=\sum x_{i} ,N = n, B = \sum y_{i}) 

解得:

x = \frac{AB-ND}{A^2 - NC}y = \frac{AD-BC}{A^2-NC}

即直线表达式为: f(x) = \frac{AB-ND}{A^2 - NC}x +\frac{AD-BC}{A^2-NC}

扩展:

若点集不变也可求使得距离之和最小得二次曲线方程,只是求偏微分方程时略有不同。

也可将点击扩展到三位空间,二元偏微分方程扩展成三元。同理也可扩展到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));
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值