各种拟合算法整理

news2025/2/25 12:27:46

各种拟合算法整理

  • 1. 最小二乘法
  • 2. 霍夫变换
  • 3. RANSAC算法

本篇将介绍最小二乘法(Least Square)、霍夫变换(Hough Transform)和RANSAC(random sample consensus,随机抽样一致性算法)算法的原理、应用和代码。

如果已经知道了一组可靠的点,可以直接使用最小二乘法完成拟合;如果点集中包含少量的噪声,建议使用加强版的最小二乘法,霍夫变换以及RANSAC算法;如果点集中包含大量噪声,推荐使用霍夫变换和RANSAC算法。

1. 最小二乘法

最小二乘法是一种常用的数学方法,用于拟合数据点到一个数学模型,并求解模型的参数,使得拟合数据点与模型之间的误差平方和最小化。基础版本的原理如下:

  • 拟合模型: 假设有一组数据点 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi,yi), 我们希望将这些数据点拟合到一个数学模型 y = f ( x ; θ ) y=f(x ; \theta) y=f(x;θ) , 其中 θ \theta θ 是模型的参数, 可以是一个或多个参数。
  • 误差计算: 对于每个数据点 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi,yi) , 计算其预测值 y ^ i = f ( x i ; θ ) \hat{y}_{i}=f\left(x_{i} ; \theta\right) y^i=f(xi;θ) 与实际值 y i y_{i} yi 之间的误差, 通常采用平方误差 e i = ( y i − y ^ i ) 2 e_{i}=\left(y_{i}-\hat{y}_{i}\right)^{2} ei=(yiy^i)2
  • 最小化误差:最小二乘法的核心思想是通过最小化误差平方和来确定模型的参数,即通过优化问题:
    min ⁡ θ ∑ i = 1 n ( y i − f ( x i ; θ ) ) 2 \min _{\theta} \sum_{i=1}^{n}\left(y_{i}-f\left(x_{i} ; \theta\right)\right)^{2} θmini=1n(yif(xi;θ))2
    求解使得误差平方和最小的参数 θ \theta θ

也可以这样描述基础版的最小二乘法: 假设有一组数据点 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi,yi),通过这些点拟合出一个直线 a x + b y + c = 0 ax+by+c=0 ax+by+c=0,其向量 n = [ a , b , c ] n = [a,b,c] n=[a,b,c],且 ∣ ∣ n ∣ ∣ 2 = 1 ||n||_2=1 ∣∣n2=1。可以将最小二乘法理解为通过使数据点到拟合直线的距离和最小化来确定直线的最佳拟合 E = ∑ i = 1 n ( a x i + b y i + c ) 2 E=\sum_{i=1}^{n}\left(a x_{i}+b y_{i}+c\right)^{2} E=i=1n(axi+byi+c)2。可以这样描述优化目标:
x ^ = [ a ^ , b ^ , c ^ ] T = min ⁡ x ∥ A x ∥ 2 2 , s.t.  ∥ x ∥ 2 = 1 A = [ x 1 y 1 1 ⋮ ⋮ ⋮ x n y n 1 ] , x = [ a , b , c ] T \begin{array}{c} \hat{\mathbf{x}}=[\hat{a}, \hat{b}, \hat{c}]^{T}=\min _{\mathbf{x}}\|A \mathbf{x}\|_{2}^{2} \text {, s.t. }\|\mathbf{x}\|_{2}=1 \\ A=\left[\begin{array}{ccc} x_{1} & y_{1} & 1 \\ \vdots & \vdots & \vdots \\ x_{n} & y_{n} & 1 \end{array}\right], \mathbf{x}=[a, b, c]^{T} \end{array} x^=[a^,b^,c^]T=minxAx22, s.t. x2=1A= x1xny1yn11 ,x=[a,b,c]T
目的就是,得到最优的 [ a , b , c ] 。 [a,b,c]。 [a,b,c]很明显对于这种问题,结合谱定理和瑞利商,可以知道 a , b , c {a,b,c} a,b,c为矩阵 A T A A^TA ATA的最小特征值对应的单位特征向量。
对于线性模型为 A x = b Ax=b Ax=b的问题,优化目标为:
x ^ = min ⁡ x ∥ A x − b ∥ 2 2 , A ∈ R n × m , x ∈ R m , b ∈ R n \hat{\mathbf{x}}=\min _{\mathbf{x}}\|A \mathbf{x}-\mathbf{b}\|_{2}^{2}, A \in \mathbb{R}^{n \times m}, \mathbf{x} \in \mathbb{R}^{m}, \mathbf{b} \in \mathbb{R}^{n} x^=xminAxb22,ARn×m,xRm,bRn
得,
x ˉ = ( A T A ) − 1 A T b \bar{x} = (A^TA)^{-1}A^Tb xˉ=(ATA)1ATb

  • 最小二乘法拓展
  1. L1正则化最小二乘法
    L1正则化是在最小二乘法的基础上加入了L1范数惩罚项,用于对模型参数进行稀疏化,从而达到特征选择的效果。其优化目标为:
    min ⁡ θ ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 p ∣ θ j ∣ \min _{\theta} \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}+\lambda \sum_{j=1}^{p}\left|\theta_{j}\right| θmini=1n(yiy^i)2+λj=1pθj
    其中 λ λ λ 是正则化参数,控制正则化项对模型的影响, θ θ θ是模型的参数, p p p是参数的数量。通过调节 λ λ λ的大小,可以控制模型的稀疏性,较大的 λ \lambda λ值会导致更多的参数趋向于零(正则化参数越大,模型越稀疏)。

    特点:L1正则化最小二乘法适用于具有大量特征的数据集,能够进行特征选择,但对于参数估计可能产生偏差

  2. L2正则化的最小二乘法
    L2正则化是在最小二乘法的基础上加入了L2范数惩罚项,用于控制模型的复杂度,防止过拟合。其优化目标为:
    min ⁡ θ ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 p θ j 2 \min _{\theta} \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}+\lambda \sum_{j=1}^{p} \theta_{j}^{2} θmini=1n(yiy^i)2+λj=1pθj2
    与L1正则化不同的是,L2正则化对参数的惩罚是平方项,因此不会导致参数的稀疏性,而是对参数进行约束,使得参数值相对较小。

    特点:控制模型复杂度,防止过拟合,对于参数估计不会产生稀疏性。

  3. Cauchy型的最小二乘法
    Cauchy的最小二乘法是改变了误差函数,使用了Cauchy分布来描述误差,从而提高了对离群值的鲁棒性。Cauchy分布具有较长的尾部,因此对于较大的误差值,Cauchy的最小二乘法会给予较小的权重,使得模型对离群值不敏感。其优化目标为:
    min ⁡ θ ∑ i = 1 n log ⁡ ( 1 + ( y i − y ^ i ) 2 ) \min _{\theta} \sum_{i=1}^{n} \log \left(1+\left(y_{i}-\hat{y}_{i}\right)^{2}\right) θmini=1nlog(1+(yiy^i)2)
    特点:提高了对离群值的鲁棒性,但在数据分布不满足Cauchy分布假设时可能效果不佳。

  4. Huber的最小二乘法
    Huber最小二乘法是一种对线性回归模型中的异常值具有鲁棒性的方法。它采用了Huber损失函数来代替普通的平方损失函数,以减小异常值对拟合模型的影响。
    Huber损失函数定义如下:
    L δ ( r ) = { 1 2 r 2 ,  if  ∣ r ∣ ≤ δ δ ( ∣ r ∣ − 1 2 δ ) ,  if  ∣ r ∣ > δ L_{\delta}(r)=\left\{\begin{array}{ll} \frac{1}{2} r^{2}, & \text { if }|r| \leq \delta \\ \delta\left(|r|-\frac{1}{2} \delta\right), & \text { if }|r|>\delta \end{array}\right. Lδ(r)={21r2,δ(r21δ), if rδ if r>δ

    其中 , r = y − y ^ r=y-\hat{y} r=yy^是残差, δ δ δ是一个阈值参数,用于控制对异常值的惩罚程度。

    Huber最小二乘法的优化目标可以表达为:
    min ⁡ β ∑ i = 1 n L δ ( y i − y ^ i ) + λ ∥ β ∥ 2 \min _{\beta} \sum_{i=1}^{n} L_{\delta}\left(y_{i}-\hat{y}_{i}\right)+\lambda\|\beta\|^{2} βmini=1nLδ(yiy^i)+λβ2
    其中 β 是待求解的系数向量, y y y是观测值, y ^ i \hat{y}_{i} y^i是模型预测值, λ λ λ 是正则化参数,用于控制模型的复杂度。

    Huber最小二乘法与普通的最小二乘法相比,对于小残差采用平方损失,对于大残差则采用线性损失。这样设计的损失函数可以使模型对异常值具有一定的鲁棒性,在一定程度上减少了异常值对模型拟合的影响。

    求解Huber最小二乘法通常采用迭代方法,如梯度下降或坐标下降,来优化损失函数并得到最优的系数向量β。

2. 霍夫变换

霍夫变换(Hough Transform)是一种用于检测图像中几何形状的技术,特别适用于检测直线、圆和其他形状。

霍夫变换的基础可以这么理解:在坐标系 x o y xoy xoy中的一条直线 y = m 0 x + b 0 y = m_0x + b_0 y=m0x+b0在坐标系 m o b mob mob中可以使用一个点P ( m 0 , b 0 ) (m_0,b_0) (m0,b0)来表示。

霍夫变换的核心是投票累积,霍夫变换的原理步骤如下:

  • 参数化表示: 直线可以用极坐标形式表示为 y = m 0 x + b 0 y=m_0x+b_0 y=m0x+b0 m 0 m_0 m0是线的斜率, b 0 b_0 b0是截距
  • 参数空间: 对于给定的图像,我们可以构建一个参数空间,其中横轴表示 m m m的取值范围,纵轴表示 b b b的取值范围。
  • 投票累积: 对于图像中的每个边缘点,计算它们对应的参数 m m m b b b的可能取值,并在参数空间中进行投票。
  • 峰值检测: 在参数空间中找到累积投票最高的点,这些点对应的直线就是图像中存在的直线

特点 : 霍夫变换的优点是对于图像中的噪声和缺失部分具有一定的鲁棒性,可以检测到完整或部分可见的几何形状。霍夫变换一般在三个(包含)以下的位置参数的模型中使用,一般工作了2维和3维的数据中。
在这里插入图片描述
在这里插入图片描述

3. RANSAC算法

  • RANSAC算法步骤:
    • 随机采样: 从数据集中随机选择一定数量的样本点(最小样本集),用这些样本点来拟合模型。
      模型拟合: 使用所选样本点来拟合模型,得到一个候选模型。

    • 内点检验: 对于剩余的数据点,计算它们到候选模型的拟合误差,并根据预设的阈值 τ \tau τ判断哪些点是内点(符合模型的点)。阈值 τ \tau τ多通过经验确定。

    • 模型评估: 统计内点的数量作为模型的评估指标。

    • 迭代更新: 如果当前模型内点数量大于某个阈值,并且模型的评估指标优于之前的模型,则更新最优模型和内点集合;如果内点比例没有达到设置的阈值,就继续从步骤1开始进行迭代,直到达到设定的迭代次数N,从N次迭代的结果中选取内点比例最多的一次,进行模型更新。

    • 最优模型: 在迭代结束后,选取内点最多的模型作为最优模型。

迭代次数N个取值也有固定的套路,可以根据给定参数选取一个合理的值,不然的话没有一个度量。计算过程如下:
已知, e e e表示噪声点概率,也就是一个点是外点的概率,也就是点集中噪声点的概率; s s s表示拟合这个模型需要的最少点数,线为2,面为3;N为最大迭代次数; p p p为才样本中取值,至少有一次取到的都是内点的概率;因此,有:
( 1 − ( 1 − e ) s ) N = 1 − p (1-(1-e)^s)^N = 1-p \\ (1(1e)s)N=1p
其中, 1 − e 1-e 1e表示取出一个点不是噪声点的概率, ( 1 − e ) s (1-e)^s (1e)s表示取出的s个点都不是噪声点的概率, 1 − ( 1 − e ) s 1-(1-e)^s 1(1e)s表示取出的s个点中有噪声, ( 1 − ( 1 − e ) s ) N (1-(1-e)^s)^N (1(1e)s)N表示完成了N次采样,每次都有噪声点。
得,
N = l o g ( 1 − p ) l o g ( 1 − ( 1 − e ) s ) N = {log(1-p) \over log(1-(1-e)^s)} N=log(1(1e)s)log(1p)
查表就可以得到我们要设置的最大迭代次数N为多大,表如下:
在这里插入图片描述

  • RANSAC算法本质:
    RANSAC算法的本质是通过随机采样和迭代更新的方式,从包含噪声和异常值的数据中找到最优的模型参数。它通过对内点和外点的区分,能够有效地排除异常值对模型拟合的影响,从而得到更鲁棒的模型。

    RANSAC的优点在于对异常值具有较好的鲁棒性,能够适应各种数据噪声和异常情况。然而,它的缺点是计算复杂度较高,对于数据量较大的情况可能耗时较长,同时需要事先设置一些参数如采样数量、拟合误差阈值等,不同的参数设置可能会影响算法的性能和结果。

  • C++代码

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

struct Point {
    double x;
    double y;
};

struct Line {
    double slope;
    double intercept;
};

Line fitLineRANSAC(const std::vector<Point>& points, int iterations, double threshold) {
    srand(time(nullptr));
    Line bestLine;
    int bestInliers = 0;

    for (int i = 0; i < iterations; ++i) {
        // Randomly sample two points
        int idx1 = rand() % points.size();
        int idx2 = rand() % points.size();
        while (idx1 == idx2) {  // Ensure different points are selected
            idx2 = rand() % points.size();
        }

        const Point& p1 = points[idx1];
        const Point& p2 = points[idx2];

        // Fit a line using the sampled points
        Line candidateLine;
        candidateLine.slope = (p2.y - p1.y) / (p2.x - p1.x);
        candidateLine.intercept = p1.y - candidateLine.slope * p1.x;

        // Count inliers
        int inliers = 0;
        for (const Point& point : points) {
            double error = std::abs(point.y - (candidateLine.slope * point.x + candidateLine.intercept));
            if (error <= threshold) {
                inliers++;
            }
        }

        // Update best line if this one has more inliers
        if (inliers > bestInliers) {
            bestInliers = inliers;
            bestLine = candidateLine;
        }
    }

    return bestLine;
}

int main() {
    std::vector<Point> points = { {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 7}, {7, 8} };
    int iterations = 1000;
    double threshold = 0.5;

    Line fittedLine = fitLineRANSAC(points, iterations, threshold);

    std::cout << "Fitted line: y = " << fittedLine.slope << "x + " << fittedLine.intercept << std::endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据绑定多级对象属性时的报错解决

数据绑定多级对象属性时的报错解决 &#xff08;1&#xff09;例子如下&#xff1a; &#xff08;2&#xff09;当syncObjForm被后台数据赋值时&#xff0c;会产生报错&#xff1a; &#xff08;3&#xff09;原因就是&#xff1a; 模板在渲染时&#xff0c;读取对象中的某个…

Apache SeaTunnel 社区 3 月月报

各位热爱 SeaTunnel 的小伙伴们&#xff0c;SeaTunnel 社区 3 月月报来啦&#xff01;这里将记录 SeaTunnel 社区每个月的重要更新&#xff0c;并评选出月度之星&#xff0c;欢迎关注。 SeaTunnel 月度 Merge Stars 感谢以下小伙伴 3 月为 Apache SeaTunnel 做的精彩贡献&…

家用洗地机哪个型号推荐?盘点四款最高性价比机型

在当今快节奏的生活中&#xff0c;有娃家庭的地面打扫已经成为日常的卫生保洁&#xff0c;对于许多家庭来说&#xff0c;洗地机成为了必备的助手。然而&#xff0c;面对市场上琳琅满目的洗地机品牌和型号&#xff0c;我们通常为选择哪款好&#xff1f;哪款性价比高而犯难。因为…

Linux系统本地搭建DbGate数据库并结合内网穿透实现无公网IP远程连接

文章目录 1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数据库管理工…

Python使用requests+excel进行接口自动化测试!

在当今的互联网时代中&#xff0c;接口自动化测试越来越成为软件测试的重要组成部分。Python是一种简单易学&#xff0c;高效且可扩展的语言&#xff0c;自然而然地成为了开发人员的首选开发语言。而requests和xlwt这两个常用的Python标准库&#xff0c;能够帮助我们轻松地开发…

Java基础入门--第十二章--多线程

多线程 12.1 进程与进程12.1.1 进程12.1.2 线程 12.2 线程的创建12.2.1 继承Thread类创建多线程12.2.2 实现Runnable接口创建多线程12.2.3 实现Callable接口创建多线程12.2.4 Thread类与Runnable接口实现多线程的对比12.2.5 后台线程 12.3 线程的生命周期及状态转换12.4 线程操…

谷歌浏览器网页自动刷新插件

谷歌浏览器网页自动刷新插件下载&#xff1a;https://www.123pan.com/s/f43eVv-CO7Kd.html 效果图&#xff08;win和mac系统同样操作&#xff09; 1.打开谷歌浏览器&#xff0c;点击头像旁边的三点&#xff0c;点击扩展程序&#xff0c;点击管理扩展程序。 2.打开开发者模式&a…

用 ElementPlus 的日历组件 Calendar 自定义渲染

文章目录 需求分析1. 英文改为中文2. 修改样式3. 自定义头部4. 增删改功能接入 需求 使用 ElementPlus中的 Calendar 组件完成自定义渲染 分析 1. 英文改为中文 转为中文的方式&#xff1a;用 ElementPlus的日历组件如何改为中文 2. 修改样式 附源码 <template><…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

内容创作策略:打造影响力强大的技术博客

CSDN的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第6篇文章——“博客内容创作策略”。本文为技术博主提供了一个精简的内容创作策略指南&#xff0c;涵盖了设定目标、分析竞争、关键词研究、内容规划…

PMP与软考的区别看不懂?看懂这五点,小白都知道怎么选!

如果你心怀抱负&#xff0c;不甘心做项目“小透明” 如果你遇到年龄危机&#xff0c;进阶管理无门道&#xff1f; 如果你是技术&#xff0c;管理项目有如盲人摸象&#xff1f;可以考PMP! 如果你准备想攒积分&#xff0c;轻松落户 如果你想评职称&#xff0c;获得专业技术职务 如…

【环境搭建】(五)Ubuntu22.04安装cuda_11.8.0+cudnn_8.6.0

一个愿意伫立在巨人肩膀上的农民...... 设备配置&#xff1a; 一、安装GCC 安装cuda之前&#xff0c;首先应该安装GCC&#xff0c;安装cuda需要用到GCC&#xff0c;否则报错。可以先使用下方指令在终端查看是否已经安装GCC。 gcc --version 如果终端打印如下则说明已经安装…

【浏览器】Google Chrome浏览器打开自动访问网址 gw1.dhwz333.top

目录 [TOC](目录) 问题描述1、查看谷歌浏览器信息2、查看快捷方式属性2、查找注册表3、重装浏览器 解决方案一、使用360系统急救箱进行杀毒步骤1、下载360系统急救箱方式1、直接下载方式2、从360杀毒中打开&#xff0c;需要联网2.1、打开“功能大全”2.2、打开系统急救箱 步骤2…

Fitzgerald:Renin antibody抗体

货号&#xff1a;10-2421 名称&#xff1a;Renin antibody 规格&#xff1a;250ug 产品描述&#xff1a; 别名&#xff1a;Monoclonal Renin antibody, Anti-Renin antibody, FLJ10761 antibody, HNFJ2 antibody, REN antibody, RENI antibody, Renin antibody, renin precu…

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

【C#】版本号

&#x1f4bb; 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp16 {internal class Program{static void Main(string[] args){Version version01 new Version("4.0.0…

SSM整合----第一个SSM项目

文章目录 前言一、使用步骤1.引入库2.建表3 项目结构4 web.xml的配置5 配置数据源6 SpringMVC配置7 配置MyBatis Mapper8 书写控制类 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; SSM整合是指Spring、SpringMVC和MyBatis这三个框架的整合使用。…

数据结构OJ题——栈和队列

1. 用栈实现队列&#xff08;OJ链接&#xff09; 题目描述&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回…

Mysql安装和初始化密码

一、下载地址&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 1、解压到本地目录下&#xff0c;然后配置环境变量&#xff08;也可以不配置&#xff0c;不影响使用&#xff0c;不过为了区分多版本的MySQL最好配置一下系统变量&#xff09; 复制…

分享:temu跨境电商项目是真的能赚钱吗?有哪些技巧?

近年来&#xff0c;跨境电商成为了一个备受瞩目的领域&#xff0c;temu跨境电商项目也吸引了众多创业者和投资者的目光。那么&#xff0c;temu跨境电商项目真的能够赚钱吗?又有哪些技巧可以帮助我们在这个领域取得成功呢? 首先&#xff0c;可以肯定的是&#xff0c;temu跨境电…