史上最易懂的最小二乘法实践:线性最小二乘法推导与Python求解编程教程

最小二乘法有什么用?一般用它做什么事?

我们最早接触最小二乘法是在高中的时候学的。最小二乘法一般被用来拟合数据。什么叫做拟合数据?
就是给定你一堆数据,然后你假设这些数据是满足某种函数的,比如你假设这些数据是一条直线。现在问题来了到底这些数据所对应的那条直线斜率是多少截距是多少?这就得用最小二乘法来求解。
总结:最小二乘法拟合数据的步骤有两步。1.首先,假设这些数据符合某种函数。而这种函数往往有几个待设定的参数,不同数据对应不同参数。(就像直线一样不同数据,拟合这些数据的直线的斜率和截距都不一样)。2.然后,使用最小二乘法求解前面步骤提到的那几个待设定参数。具体怎么求解请看后面的内容。

从实例中学习线性最小二乘法

假设我们需要拟合下面这三个点。
史上最易懂的最小二乘法实践:线性最小二乘法推导与Python求解编程教程_第1张图片
前面提到了第一步我们需要假设这些数据符合某种函数。在这里我们假设它们是符合线性函数的。假设拟合他们的直线方程为 y = k x + b y=kx+b y=kx+b。其中k是斜率,b是截距。这两个都是未知的待求解的量
如果他们完全是在直线上那么他们应该要满足 y = k x + b y=kx+b y=kx+b。现在有三个数据点那么代入到 ( k x + b ) = y (kx+b)=y (kx+b)=y可以得到三个式子(由于数据并不完全在直线上所以是约等于)。
( k x 1 + b ) ≈ y 1 ( k x 2 + b ) ≈ y 2 ( k x 3 + b ) ≈ y 3 (kx1+b)\approx y1\\ (kx2+b)\approx y2\\ (kx3+b)\approx y3 (kx1+b)y1(kx2+b)y2(kx3+b)y3
我们需要根据上面三个式子求出k和b。
为了能让计算机快速的求解我们将上面那个式子写成矩阵相乘的形式。
[ x 1 1 x 2 1 x 3 1 ] [ k b ] = [ y 1 y 2 y 3 ] \begin{bmatrix} x1 & 1 \\ x2 & 1\\ x3 & 1 \end{bmatrix} \begin{bmatrix} k \\ b \end{bmatrix}= \begin{bmatrix} y1 \\ y2\\ y3 \end{bmatrix} x1x2x3111[kb]=y1y2y3
为了书写方便,我们将这几个矩阵分别弄个名字。定义:
A = [ x 1 1 x 2 1 x 3 1 ] x = [ k b ] y = [ y 1 y 2 y 3 ] A=\begin{bmatrix} x1 & 1 \\ x2 & 1\\ x3 & 1 \end{bmatrix} \\ x=\begin{bmatrix} k \\ b \end{bmatrix} \\ y=\begin{bmatrix} y1 \\ y2\\ y3 \end{bmatrix} A=x1x2x3111x=[kb]y=y1y2y3
因此我们得到了一个等式 A x = y Ax=y Ax=y。我们已知A和y,需要求x。按道理我们直接对A求逆就可以求出x。但是由于现在A不是方阵没法求逆。虽然A不是方阵但是 A T A A^TA ATA却是方阵。我们在等式 A x = y Ax=y Ax=y两边同时乘上 A T A^T AT即可得到 A T A x = A T y A^TAx=A^Ty ATAx=ATy,然后 x = ( A T A ) − 1 A T y = [ 1.5 − 0.333 ] x=(A^TA)^{-1}A^Ty=\begin{bmatrix} 1.5\\ -0.333 \end{bmatrix} x=(ATA)1ATy=[1.50.333]
所以最优的那条拟合曲线就是y = 1.5x – 0.333。
下面我们用Python编程实现下这个求解过程

Python实现线性最小二乘法

import numpy as np

A = np.array([
    [1, 1],
    [2, 1],
    [3, 1],
])

y = np.array([1, 3, 4])

x = np.matmul(np.matmul(np.linalg.inv(np.matmul(A.T,A)),A.T),y)

print("求得直线为:y={}*x+{}".format(x[0],x[1]))

你可能感兴趣的:(视觉SLAM从入门到实践,机器学习中的数学,最小二乘法,线性最小二乘法,Python实践,教程,机器学习)