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

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

总体最小二乘法
将直线使用如下方程表示:
\]
点\((x_1, y_1)\)到直线的距离可以表示为:
\]
假设\(a^2+b^2=1\),那么点\((x_1, y_1)\)到直线的距离可以表示为:
\]
如果拟合直线的参数为\(a,b,c\),点到拟合直线距离称为该点的拟合误差,给定\(n\)个点\((x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)\),那么直线的拟合方差为:
\]
方差最小时的\(a,b,c\)为直线的拟合参数。这里把方差记为\(\pmb{E}\),即\(\pmb{E}=\begin{Vmatrix}\pmb{\sigma}\end{Vmatrix}^2\)。由于极值处的偏导为0,先对\(\pmb{E}\)求\(c\)的偏导:
\]
得到:
\]
代入方差表达式\(\eqref{4}\)得:
\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*}
\]
其中:
x_1-\overline{x} & y_1-\overline{y} \\
\vdots & \vdots \\
x_n-\overline{x} & y_n-\overline{y}
\end{bmatrix} \tag{8}
\]
\]
由于\(a^2+b^2=1\),即\(\pmb{z}^T\pmb{z}=1\)。可使用Lagrange乘法求解,目标函数为:
\]
式中\(\lambda\)为Lagrange乘数,由\(\frac{\partial J(\pmb{z})}{\partial \pmb{z}}=0\),得到:
\]
可见\(\lambda\)和\(\pmb{z}\)分别为矩阵\(\pmb{B}^T\pmb{B}\)的特征值和特征向量。
\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\)为最小特征值对应的特征向量。
参考文档
- 计算机视觉入门-最小二乘法、随机取样法、鲁棒估计、霍夫变换
- 矩阵分析与应用(第2版)张贤达
- 直线拟合——最小二乘法、hough变换
总体最小二乘法(Total Least Squares)拟合直线的更多相关文章
- halcon之最小二乘拟合直线
如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...
- [MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现
[MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现 code #%% from matplotlib import pyplot as plt from mxnet import autog ...
- python matplotlib拟合直线
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['sans-serif'] plt. ...
- RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较
代码下载地址: 1.Matlab版本:http://pan.baidu.com/s/1eQIzj3c.进入目录后,请自行定位到该博客的源代码与数据的目录“
- Ransac 与 最小二乘(LS, Least Squares)拟合直线的效果比较
代码下载地址 http://pan.baidu.com/s/1eQIzj3c 进入目录后,请自行定位到该博客的源代码与数据的目录“
- golang 实现最小二乘法拟合直线
func LeastSquares(x[]float64,y[]float64)(a float64,b float64){ // x是横坐标数据,y是纵坐标数据 // a是斜率,b是截距 xi := ...
- 最小二乘法(least squares method)
一.背景 号到北大去听hulu的讲座<推荐系统和计算广告在视频行业应用>,想到能见到传说中的项亮大神,特地拿了本<推荐系统实践>求签名.讲座开始,主讲人先问了下哪些同学有机器学 ...
- 分析一则halcon抓边拟合直线的小案例
例图: 完整算法: read_image (Image, 'C:/Users/Administrator/Desktop/1.png') threshold (Image, Regions, , ) ...
- Halcon使用骨架法处理激光条并拟合直线
dev_close_window () * 设置颜色 dev_set_color ('green') * 读取图像 read_image (Image, 'images3/1') * 获得图像尺寸 g ...
- OpenCV2马拉松第25圈——直线拟合与RANSAC算法
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...
随机推荐
- delphi TThread.WaitFor 用法
在 Delphi 中,TThread.WaitFor 方法用于等待一个线程完成执行.当你创建一个线程并希望主线程(或其他线程)等待这个线程结束时,你可以使用这个方法. 以下是 TThread.Wait ...
- .NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记
13 | 配置绑定:使用强类型对象承载配置数据 要点: 1.支持将配置值绑定到已有对象 2.支持将配置值绑定到私有属性上 继续使用上一节代码 首先定义一个类作为接收配置的实例 class Config ...
- Shell中调用可执行文件,手动执行可以执行,crontab执行就报错:exec: java: not found
今天发现一个很奇怪的问题,就是我编写的shell脚本, 手动执行可以正常执行,但是放到crontab中就报错.line 60: exec: java: not found 百度搜索发现原来是java ...
- Python OS.mkdirs与OS.makedirs的区别
os.mkdir只创建最外层目录,如果创建多级目录,报错"FileNotFoundError: [WinError 3] 系统找不到指定的路径".目录存在报错. os.makedi ...
- useEffect与useLayoutEffect
useEffect与useLayoutEffect useEffect与useLayoutEffect可以统称为Effect Hook,Effect Hook可以在函数组件中执行副作用操作,副作用是指 ...
- 华为OD请己经入职的人出来谈谈你的真实感受?
修改了一下回答的排版,之前只要更新就在最前面, 现在按照会见顺序重新整理了一下. 部门捞人 上海 深圳 西安 东莞 办公地 武汉南京现在也有 通道:点击通道2字 写在前面 总结一下我的体验其实挺好的, ...
- gin框架中的c.Next()/c.Abort()
package main import ( "fmt" "github.com/gin-gonic/gin" ) func func1(c *gin.Conte ...
- Vue源码学习(十):关于dep和watcher使用的一些思考
好家伙, 前面想了好久,都没想明白为什么要dep和watcher打配合才能实现数据-视图同步 为什么要多一个依赖管理这样的东西 给每个数据绑个watcher(xxfunction),然后,数据变了 ...
- 【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
问题描述 参考官方文档,通过CS Code创建JavaScription Function,在本地远行时候出现: Value cannot be null. (Parameter 'provider' ...
- Inertial Explorer Xpress 学习笔记
KEY WORDS: Coordinate Updates (CUPTs) Zero Velocity Updates (ZUPTs) Google Protocol Buffer (GPB) 是一 ...