前言

最小二乘法是最小化每个点到直线的垂直误差,由于误差采用的是垂直误差,导致越接近垂直线(平行于\(y\)轴),拟合效果越差,无法拟合垂直线。

通过最小化每个点到直线的距离误差可以解决最小二乘法无法拟合垂直线的问题,也就是总体最小二乘法(Total Least Squares)。

总体最小二乘法

将直线使用如下方程表示:

\[ax+by+c=0 \tag{1}
\]

点\((x_1, y_1)\)到直线的距离可以表示为:

\[\pmb{e} = \frac{|ax_1+bx_1+c|}{\sqrt{a^2+b^2}} \tag{2}
\]

假设\(a^2+b^2=1\),那么点\((x_1, y_1)\)到直线的距离可以表示为:

\[\pmb{e} = |ax_1+by_1+c| \quad , \quad a^2+b^2=1 \tag{3}
\]

如果拟合直线的参数为\(a,b,c\),点到拟合直线距离称为该点的拟合误差,给定\(n\)个点\((x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)\),那么直线的拟合方差为:

\[\begin{Vmatrix}\pmb{\sigma}\end{Vmatrix}^2=\frac{1}{n}\sum\limits_{i=1}^{i=n}{(ax_i+by_i+c)^2} \quad , \quad a^2+b^2=1 \tag{4} \label{4}
\]

方差最小时的\(a,b,c\)为直线的拟合参数。这里把方差记为\(\pmb{E}\),即\(\pmb{E}=\begin{Vmatrix}\pmb{\sigma}\end{Vmatrix}^2\)。由于极值处的偏导为0,先对\(\pmb{E}\)求\(c\)的偏导:

\[\frac{\partial \pmb{E}}{\partial c}=\frac{2}{n}\sum\limits_{i=1}^{i=n}{\big(ax_i+by_i+c\big)}=0 \tag{5}
\]

得到:

\[c=-\frac{a}{n}\sum\limits_{i=1}^{i=n}x_i-\frac{b}{n}\sum\limits_{i=1}^{i=n}y_i=-a\overline{x}-b\overline{y} \tag{6}
\]

代入方差表达式\(\eqref{4}\)得:

\[\begin{align*}
\pmb{E} &=\frac{1}{n}\sum\limits_{i=1}^{i=n}{(ax_i+by_i-a\overline{x}-b\overline{y})^2} \tag{7} \\
&= \frac{1}{n}\sum\limits_{i=1}^{i=n}\Big({a(x_i-\overline{x})+b(y_i-\overline{y})}\Big)^2 \\

&=
\begin{Vmatrix}
\begin{bmatrix}
x_1-\overline{x} & y_1-\overline{y} \\
\vdots & \vdots \\
x_n-\overline{x} & y_n-\overline{y}
\end{bmatrix}
\begin{bmatrix}
a \\
b
\end{bmatrix}

\end{Vmatrix}^2 \\

&=\begin{Vmatrix}\pmb{Bz}\end{Vmatrix}^2
\end{align*}
\]

其中:

\[\pmb{B}= \begin{bmatrix}
x_1-\overline{x} & y_1-\overline{y} \\
\vdots & \vdots \\
x_n-\overline{x} & y_n-\overline{y}
\end{bmatrix} \tag{8}
\]
\[\pmb{z}=\begin{bmatrix}a\\b\end{bmatrix} \tag{9}
\]

由于\(a^2+b^2=1\),即\(\pmb{z}^T\pmb{z}=1\)。可使用Lagrange乘法求解,目标函数为:

\[J(\pmb{z})=\begin{Vmatrix}\pmb{Bz}\end{Vmatrix}^2+\lambda\big(1-\pmb{z}^T\pmb{z}\big) \tag{10}
\]

式中\(\lambda\)为Lagrange乘数,由\(\frac{\partial J(\pmb{z})}{\partial \pmb{z}}=0\),得到:

\[\pmb{B}^T\pmb{B}\pmb{z}=\lambda \pmb{z} \tag{11}
\]

可见\(\lambda\)和\(\pmb{z}\)分别为矩阵\(\pmb{B}^T\pmb{B}\)的特征值和特征向量。

\[\pmb{B}^T\pmb{B} = \begin{bmatrix}
\sum\limits_{i=1}^{i=n}\big(x_1-\overline{x}\big)^2
& \sum\limits_{i=1}^{i=n}\big(x_1-\overline{x}\big)\big(y_1-\overline{y}\big) \\
\sum\limits_{i=1}^{i=n}\big(x_1-\overline{x}\big)\big(y_1-\overline{y}\big) & \sum\limits_{i=1}^{i=n}\big(y_1-\overline{y}\big)^2
\end{bmatrix} \tag{12}
\]

可见矩阵\(\pmb{B}^T\pmb{B}\)为2阶矩阵,因此存在2个特征值和特征向量。\(\pmb{E}=\begin{Vmatrix}\pmb{Bz}\end{Vmatrix}^2=\pmb{z}\pmb{B}^T\pmb{B}\pmb{z}=\pmb{z}^T\lambda\pmb{z}=\lambda\)的最小值为矩阵\(\pmb{B}^T\pmb{B}\)最小的特征值,而直线拟合参数\(a,b\)为最小特征值对应的特征向量。

参考文档

  1. 计算机视觉入门-最小二乘法、随机取样法、鲁棒估计、霍夫变换
  2. 矩阵分析与应用(第2版)张贤达
  3. 直线拟合——最小二乘法、hough变换

总体最小二乘法(Total Least Squares)拟合直线的更多相关文章

  1. halcon之最小二乘拟合直线

    如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...

  2. [MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现

    [MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现 code #%% from matplotlib import pyplot as plt from mxnet import autog ...

  3. python matplotlib拟合直线

    import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['sans-serif'] plt. ...

  4. RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较

    代码下载地址: 1.Matlab版本:http://pan.baidu.com/s/1eQIzj3c.进入目录后,请自行定位到该博客的源代码与数据的目录“

  5. Ransac 与 最小二乘(LS, Least Squares)拟合直线的效果比较

    代码下载地址      http://pan.baidu.com/s/1eQIzj3c 进入目录后,请自行定位到该博客的源代码与数据的目录“

  6. golang 实现最小二乘法拟合直线

    func LeastSquares(x[]float64,y[]float64)(a float64,b float64){ // x是横坐标数据,y是纵坐标数据 // a是斜率,b是截距 xi := ...

  7. 最小二乘法(least squares method)

    一.背景 号到北大去听hulu的讲座<推荐系统和计算广告在视频行业应用>,想到能见到传说中的项亮大神,特地拿了本<推荐系统实践>求签名.讲座开始,主讲人先问了下哪些同学有机器学 ...

  8. 分析一则halcon抓边拟合直线的小案例

    例图: 完整算法: read_image (Image, 'C:/Users/Administrator/Desktop/1.png') threshold (Image, Regions, , ) ...

  9. Halcon使用骨架法处理激光条并拟合直线

    dev_close_window () * 设置颜色 dev_set_color ('green') * 读取图像 read_image (Image, 'images3/1') * 获得图像尺寸 g ...

  10. OpenCV2马拉松第25圈——直线拟合与RANSAC算法

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...

随机推荐

  1. Kafka-如何重设消费者位移(重设OFFSET)

    1. 为什么要重设消费者组位移? 我们知道,Kafka 和传统的消息引擎在设计上是有很大区别的,其中一个比较显著的区别就是,Kafka 的消费者读取消息是可以重演的(replayable). 像 Ra ...

  2. Docker 容器逃逸漏洞 (CVE-2020-15257)

    漏洞详情 Docker发布一个容器逃逸漏洞,攻击者利用该漏洞可以实现容器逃逸,提升特权并破坏主机. containerd使用的抽象套接字仅使用UID做验证,即任意UID为0的进程均可访问此API. 当 ...

  3. Centos8 单机配置 Zookeeper3.6.3 集群

    安装 Zookeeper 3.6.3 前提 已经安装好 JDK8+. 如果使用JDK8, 版本需要在211以上. 下载, 解压 使用root用户 wget https://downloads.apac ...

  4. STM32的时钟控制RCC和外设定时器

    STM32的RCC(Reset and Clock Control)时钟控制 stm32f103c8的时钟是72MHz, stm32f401ccu6的时钟是80M, 开发板板载两个晶振, 一个高速一个 ...

  5. 全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集

    前言 这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了. 工欲善其事,必先利其器,在正式开始之前,我们先要搞懂如何切分数 ...

  6. c++STL用法总结

    一.vector的用法 vector<int> vet; 1.排序:sort(vet.begin(), vet.end()), 时间复杂度O(nlogn) 2.查找:if(find(vet ...

  7. linux下安装nginx(yum源安装)

    备份yum源 cd /etc/yum.repos.d mkdir repo_bak mv *.repo repo_bak/ 下载阿里云repo文件 wget -O /etc/yum.repos.d/C ...

  8. 【LeetCode动态规划#17】知道秘密的人,维护多个dp数组

    知道秘密的人数 在第 1 天,有一个人发现了一个秘密. 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后,每天 给一个新的人 分享 秘密.同时给你一个整数 forget ,表 ...

  9. 《Similarity-based Memory Enhanced Joint Entity and Relation Extraction》论文阅读笔记

    代码 原文 摘要 文档级联合实体和关系抽取是一项难度很大的信息抽取任务,它要求用一个神经网络同时完成四个子任务,分别是:提及检测.共指消解.实体分类和关系抽取.目前的方法大多采用顺序的多任务学习方式, ...

  10. DataGear 使用静态HTML模板制作数据可视化看板

    DataGear 看板提供了导入静态 HTML 模板的功能,使您可以利用已有的任意 HTML 网页资源快速制作数据可视化看板. 首先,您需要准备一套已设置好布局的静态 HTML 模板,其中包含的 HT ...