RANSAC算法详解+Python实现

article/2025/9/12 20:37:19

1.算法描述

RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
    局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
    RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

通俗来说就是用RANSAC算法处理一批含有噪音的点,如一批数据有M个点,其中Q个点是有噪音的,即局外点。每一个点我们都可以用(x,y)来表示。

1.首先我们会根据数据提出一个模型来拟合局内点。如f(x) = 0或f(x) = y,这个假设模型的参数需要我们后续求取。由于Q个点是局外点,并不影响我们的模型参数,因此只要剩下M-Q个点满足f(x) < ε,就认为假设的模型是合理的,其中ε是我们设定的阈值,可以理解为误差。

2.此处假设f(x)为一个线性模型,即y = ax + b。由于线性模型是一条直线,只需根据两点即可确定。我们在M个点中随机取出两个点,求出a和b,即可得到一个假设线性模型。

3.对于剩下M-2个点,依次代入我们假设的模型中,计算假设模型的y值与真实y值之间的距离,如果距离小于ε,则我们认为该点为内点,即|ax +b - y| < ε。若内点很少,则返回第二步,重新采点,生成新的假设模型进行计算。此处有两种方案,第一种是迭代足够多的次数,记录内点的数量,迭代完成后内点最多的模型即为最终我们想要的模型。第二种是设定一个阈值,如我们有500个点,如果内点个数为400,就认为当前模型可以拟合足够多的内点,跳出循环。

 

说句实话,清爽的八得了。

 

2.代码实现

下面就用实现一个线性回归的RANSAC算法代码。

import numpy as np
from matplotlib import pyplot as plt
import random#生成数据集
SIZE = 50
OUT = 20
X = np.linspace(0, 10, 50)
Y = [3 * i + 10 + 2 * random.random() for i in X[:-OUT]] + [random.randint(0, int(i)) for i in X[-OUT:]]
X_data = np.array(X)
Y_data = np.array(Y)

用matplotlib可视化出来,数据看起来是这样的。

很明显,左上角为内点,右下角为外点,即噪音。

# 选点、评估iters = 1000
epsilon = 5
threshold = 0.8
best_a, best_b = 0, 0
pre_total = 0
for i in range(iters):sample_index = random.sample(range(SIZE), 2)x_1 = X_data[sample_index[0]]x_2 = X_data[sample_index[1]]y_1 = Y_data[sample_index[0]]y_2 = Y_data[sample_index[1]]a = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1total_in = 0  #内点计数器for index in range(SIZE):y_estimate = a * X_data[index] + bif abs(y_estimate - Y_data[index]) < epsilon: #符合内点条件total_in += 1if total_in > pre_total:  #记录最大内点数与对应的参数pre_total = total_inbest_a = abest_b = bif total_in > SIZE * threshold: #内点数大于设定的阈值,跳出循环breakprint("迭代{}次,a = {}, b = {}".format(i, best_a, best_b))

也可以通过plt可视化一下

    x_line = np.linspace(0, 10, 1000)y_line = best_a * x_line + bplt.plot(x_line, y_line, c = 'r')plt.scatter(X_data, Y_data)plt.show()

最终拟合结果如下:

 


http://chatgpt.dhexx.cn/article/rvHItEmu.shtml

相关文章

RANSAC算法与原理(一)

目录 算法介绍举例 算法的基本思想和流程算法的实现流程&#xff1a;迭代次数的推导算法的实现 python代码实现References 算法介绍 首先我们从Random sample consensus - Wikipedia上找到RANSAC原理的介绍。 RANSAC算法的中文名称是随机抽样一致算法(Random Sample Consenus…

RANSAC算法——看完保证你理解

目录 1 最小二乘算法的缺陷2 RANSAC算法2.1 原理2.2 实例2.3 参数 参考感谢阅读 RANSAC全程Random sample consensus&#xff0c;中文即“随机抽样一致算法”&#xff0c;该方法采用迭代的方式从一组包含离群&#xff08;outlier或者错误数据&#xff09;的被观测数据中估算出数…

RANSAC算法介绍

一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SAmple Consensus,RANSAC&#xff09;,采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法假设数据中包含正确数据和异常数据&#xff08;或称为噪声&#xff09;。正确数据记为内点&#xff08;…

RANSAC算法讲解

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC介绍(Matlab版直线拟合+平面拟合)

RANSAC介绍&#xff08;Matlab版直线拟合平面拟合&#xff09; 本人邮箱&#xff1a;sylvester0510163.com&#xff0c;欢迎交流讨论&#xff0c; 欢迎转载&#xff0c;转载请注明网址http://blog.csdn.net/u010128736/ 一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SA…

RANSAC算法(仅供学习使用)

1.定义 RANSAC&#xff08;Random Sample Consensus&#xff09;算法是一种基于随机采样的迭代算法&#xff0c;用于估计一个数学模型参数。它最初由Fischler和Bolles于1981年提出&#xff0c;主要用于计算机视觉和计算机图形学中的模型拟合和参数估计问题。 RANSAC算法的基本…

前端调试手机app

有时候应用在电脑网页端显示是正常的&#xff0c;但是一安装到手机上或者在手机浏览器上打开&#xff0c;就会显示各种问题问题。 在网上找了很长时间&#xff0c;最方便的就是利用在电脑上利用谷歌浏览器进行调试&#xff0c;输入网址chrome://inspect/#devices&#xff0c;进…

跨平台应用开发进阶(三十七)uni-app前端监控方案 Sentry 探究

文章目录 一、前言二、Sentry 简介三、Sentry 部署3.1 docker 的部署 (mac版)3.2 部署 sentry3.3 创建项目3.4 前端部署&#xff0c;注入监控代码 四、sentry 操作界面介绍五、拓展阅读 一、前言 在日益发达的网络时代&#xff0c;web应用也是越来越复杂&#xff0c;尤其是前端…

uni-app 开发跨平台应用前端框架

前言 uni-app 是一个使用 vue.js 开发跨平台应用的前端框架&#xff0c;由于它具备"编写一次代码可发布到多个平台"的特点&#xff0c;大大的节省了开发成本&#xff0c;极速提升了开发效率。 一、uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。…

uni-app开发所有前端应用的框架

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉&#xff09;等多个平台。 DCloud公司拥有420万开发者&#xff0c;几十万应用案例、6.5亿手…

比较几种热门Hybrid App前端框架

作为一种既能够在原生应用程序环境中运行&#xff0c;也能够在 Web 浏览器中运行的应用程序&#xff0c;Hybrid App 主要使用 Web 技术进行开发&#xff0c;如 HTML、CSS 和JavaScript&#xff0c;并使用一个中间层将其封装在原生应用程序中。随着技术的持续推进&#xff0c;Hy…

APP管理平台--前端篇,首页(三)

作为首页&#xff0c;肯定在打开网址后就看得到对应信息。那么作为APP管理平台&#xff0c;这个信息自然而然的表现成了APP列表。那么依据现有各大应用市场需要分为已上线和未上线。但是在实际做的时候没有区分&#xff0c;这次项目中将所有新增的APP都展示了。区分布局就决定了…

一天撸一个财务APP系统【安卓端+前端+后端】

昨天有个粉丝朋友也想学开发Web和小程序、安卓&#xff0c;问可以在大学学会吗&#xff1f; 在学校学到的东西真的有限&#xff1a; 在很多的高校&#xff0c;有一些教授是学院派的&#xff0c;他们没有做过多少开发工作&#xff0c;上课就是照本宣科&#xff0c;讲的知识点都…

如何查看手机APP使用的前端框架?

一、首先获取该APP的apk包&#xff08;长按APP&#xff0c;点击‘分享’&#xff0c;分享到微信‘文件传输助手’&#xff0c;即可获得apk包--参考本博主上篇文章&#xff09;。 二、把apk扩展名改成.zip然后解压。不同的编译软件目录结果也不一样。&#xff08;为方便起见&am…

【网络协议】IPV4协议介绍

&#x1f4aa;本节内容&#xff1a;IPV4协议介绍、IPV4地址格式、IPV4数据格式及C项目结构体设计 &#x1f60f;【Qt6网络抓包工具项目实战】总导航目录&#xff08;建议收藏书签~~~&#xff09; ✌️ part1 &#x1f60f;【Qt6网络抓包工具项目实战】1.1Qt6.2.2环境搭建(免费…

DHCP协议

目录 1、DHCP协议 2、DHCP的工作过程 动态获取IP地址流程 跟新租期流程 解除租期流程 1、DHCP协议 DHCP(Dynamic Host Configuration Protocol)协议是处于应用层的协议。一个主机如果想正常上网&#xff0c;需要配置IP地址&#xff0c;子网掩码&#xff0c;默认网关基本配置…

TCP/IP-----协议号、端口号、ARP、icmp

文章目录 一、数据流向过程二、协议详解1&#xff09;ARP协议2&#xff09;ICMP协议 协议号 协议号是存在于IP数据报的首部的20字节的固定部分&#xff0c;占有8bit.该字段是指出此数据报所携带的是数据是使用何种协议&#xff0c;以便目的主机的IP层知道将数据部分上交给哪个处…

UDP协议

引言 本文中只关于IPv4&#xff1b;UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。总之&#xff0c;能没有的都没了。但它提供了差错检测&#xff0c;是一种端到端的校验和。因此使用它的程序必须自己实现…

BGP协议

BGP协议 工作层工作原理BGP简单配置———含密码认证配置个人图解BGP 工作层 BGP是工作在应用层的协议&#xff0c;但基于传输层的TCP协议 工作原理 路由协议通常分为内部网关协议&#xff08;IGP: Interior Gateway Protocol&#xff09;和外部网关协议&#xff08;EGP: Ext…

IP协议介绍

文章目录 定义特点作用寻址和路由&#xff1a;分片与重组&#xff1a; ①TCP分段与IP分片的区别&#xff1f;TCP分段IP分片什么是MSS&#xff1f;滑动窗口与MSS的区别&#xff1f; 什么是MTU&#xff1f;MSS与MTU的关系疑问UDP是否会进行分段&#xff1f;TCP分段后会进行IP分片…