RANSAC算法——看完保证你理解
目录
- 1 最小二乘算法的缺陷
- 2 RANSAC算法
- 2.1 原理
- 2.2 实例
- 2.3 参数
- 参考
- 感谢阅读
RANSAC全程Random sample consensus,中文即“随机抽样一致算法”,该方法采用迭代的方式从一组包含离群(outlier或者错误数据)的被观测数据中估算出数学模型的参数,相比最小二乘方法,它融合了剔除不合格数据的思想,因此对于有部分错误数据的数据样本,能够更快更准的给出辨识结果。该算法首先由Fischler和Bolles 于1981提出,他们采用该方法来解决图像定位问题(LDP)。目前在图像以及辨识等领域广泛应用。
1 最小二乘算法的缺陷
最小二乘方法,即通过最小化误差的平方和寻找数据的最佳函数匹配,广泛应用于数据辨识领域,但是其对于某些数据的拟合有一定的缺陷,最小二乘得到的是针对所有数据的全局最优,但是并不是所有数据都是适合去拟合的,也就是说数据可能存在较大的误差甚至差错,而这种差错的识别是需要一定的代价的,如下示意图(仅示意)就是一个典型的例子:
很显然,上述线性拟合的结果并不是我们想要的,我们真正需要的是一下拟合的效果:
这正是RANSAC算法的拟合效果!因为剔除了不想被参与拟合的红点而选择在一定范围内的蓝点,这样保证了样本数据的干净,保证拟合效果更接近真实。
2 RANSAC算法
2.1 原理
通用的RANSAC算法的工作流程如下[2]:
给定如下:
data – 一组观测数据组.
model – 拟合模型(例如线性、二次曲线等等).
n – 用于拟合的最小数据组数.
k – 算法规定的最大遍历次数.
t – 数据和模型匹配程度的阈值,在t范围内即inliers,在范围外即outliers.
d – 表示模型合适的最小数据组数.
返回如下:
bestFit – 一组最匹配的模型参数,即model的参数
以上前提中,data和model以及model的参数我们很容易理解,但是n、k、t、d的含义可能有点模糊,不妨先放一放,容后续慢慢理解。
函数体的伪代码如下:
参数初始化:
iterations = 0 /// 遍历次数
bestFit = nul
bestErr = something really large ///
/// 遍历
while iterations < k domaybeInliers := n /// 从数据中随机选择n个拟合的数据组maybeModel := model parameters fitted to maybeInliers /// 根据以上n个数据获得模型的参数alsoInliers := empty set /// 初始化空数据组for every point in data not in maybeInliers do /// 遍历:将处maybeInliers外的其他数据组一一与模型进行比较if point fits maybeModel with an error smaller than t /// 如果比较下来误差在t范围内,则调价到inliers集合中add point to alsoInliersend forif the number of elements in alsoInliers is > d then /// 如果当前得到的Inliers集合中的数据组数量大于d// This implies that we may have found a good model ///意味着该模型是个“好”模型(即好参数)// now test how good it is.betterModel := model parameters fitted to all points in maybeInliers and alsoInliersthisErr := a measure of how well betterModel fits these points/// 如果当前模型的与Inliers中数据的误差比之前得到的最小误差更小,则更新最小误差,/// 最优模型参数设置为当前模型参数if thisErr < bestErr thenbestFit := betterModelbestErr := thisErrend ifend ifincrement iterations /// 继续遍历
end while
多看两边以上的以上的伪代码,相信应该是可以理解四个参数的含义了,如果还不理解,没关系,还有更实际的例子。往下看:
2.2 实例
以下是用MATLAB实现的一个采用RANSAC算法模型选为线性函数的函数与实例。
function [bestParameter1,bestParameter2] = ransac_demo(data,num,iter,threshDist,inlierRatio)% data: a 2xn dataset with #n data points% num: the minimum number of points. For line fitting problem, num=2% iter: the number of iterations% threshDist: the threshold of the distances between points and the fitting line% inlierRatio: the threshold of the number of inliers %% Plot the data pointsfigure;plot(data(1,:),data(2,:),'o');hold on;number = size(data,2); % Total number of pointsbestInNum = 0; % Best fitting line with largest number of inliersbestParameter1=0;bestParameter2=0; % parameters for best fitting linefor i=1:iter%% Randomly select 2 pointsidx = randperm(number,num); sample = data(:,idx); %% Compute the distances between all points with the fitting line kLine = sample(:,2)-sample(:,1);% two points relative distancekLineNorm = kLine/norm(kLine);normVector = [-kLineNorm(2),kLineNorm(1)];%Ax+By+C=0 A=-kLineNorm(2),B=kLineNorm(1)distance = normVector*(data - repmat(sample(:,1),1,number));%% Compute the inliers with distances smaller than the thresholdinlierIdx = find(abs(distance)<=threshDist);inlierNum = length(inlierIdx);%% Update the number of inliers and fitting model if better model is found if inlierNum>=round(inlierRatio*number) && inlierNum>bestInNumbestInNum = inlierNum;parameter1 = (sample(2,2)-sample(2,1))/(sample(1,2)-sample(1,1));parameter2 = sample(2,1)-parameter1*sample(1,1);bestParameter1=parameter1; bestParameter2=parameter2;endend%% Plot the best fitting linexAxis = -number/2:number/2; yAxis = bestParameter1*xAxis + bestParameter2;plot(xAxis,yAxis,'r-','LineWidth',2);
end%% Generate random data for test
data = 150*(2*rand(2,100)-1); data = data.*rand(2,100);
ransac_demo(data,2,100,10,0.1);
结果如下:
这里,数据(data )集随机产生的100组(x,y)数据集,模型(model)为y=ax+b,需要辨识的参数即a和b, 即n为2,遍历次数k为100(数据量本身较少,可以全部遍历),t为10,即只有满足到直线y=ax+b的距离小于10的点才会被认为是inliers,d指的是认定模型及参数为好的inliers集的最小数量值,这里采用比值表示,0.1表示100的十分之一即数据量达到10即可认为已经满足要求。
2.3 参数
可以看到,RANSAC算法除了选择合适的数据和模型外,还需要选择合适的4个参数n、k、t、d,其中n、t、d可根据经验得到,那么k可以根据如下公式计算:
其中,ppp表示为RANSAC算法结果有用的概率,www为数据在inliers集中的概率,那么对于模型拟合一次需要的n个数据,其均在inliers集中的概率为wnw^nwn(放回取样概率),不在inliers集中的概率则为1−wn1-w^n1−wn,因此k次迭代的结果满足:
从而可有得到k的计算公式。
事实上在MATLAB中也存已有的函数ransac,该函数设计的更加通用,感兴趣的可以自己学习。
最后,本文的例子和原理主要参考自:《Random sample consensus》。
参考
- 维基百科:《Random sample consensus》。
- Martin A. Fischler and Robert C. Bolles (June 1981). “Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography”. Comm. of the ACM 24: 381–395. doi:10.1145/358669.358692.
- MATLAB官网关于RANSAC的介绍: https://www.mathworks.com/discovery/ransac.html
感谢阅读
RANSAC算法——看完保证你理解相关推荐
- Spring经常出现的报错原因,看完保证你技术涨一层!
在我们开发中经常会遇到很多关于Spring启动报错的问题,我司在整合几十个老系统的时候也经常出现这样的问题,而这样的场景在大一点的公司会经常出现,比如给你个任务,你整合下几个遗留系统,有几十个甚至几百 ...
- 数据结构基础知识点,看完保证期末不挂科!
数据结构基础知识 线性结构 (1)连续储存(地址在内存中为连续)-----数组 (2)离散储存(地址在内存中不一定为连续的)-----链表 非线性结构 (1)树 (2)图 基础算法(查找排序): 折半 ...
- 看完让你理解WebSocket原理
一.先来说一下Websocket是什么?(websocket与http有什么区别呢) WebSocket是html5出的东西(协议),并且是一个持久化的协议(下面将会讲到什么是持久化协议) HTTP是 ...
- 面试不慌,看完保证让你写HashMap跟玩一样
作者 | 梁唐 出品 | TechFlow(ID:techflow2019) 头图 | CSDN 下载自东方IC 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为 ...
- python面试 hashmap是什么_面试不慌,看完保证让你写HashMap跟玩一样
作者 | 梁唐 出品 | TechFlow(ID:techflow2019) 头图 | CSDN 下载自东方IC 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什 ...
- 什么叫做API?看完你就理解了 老夏博客
阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface, ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
JWT简介 JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从 ...
- 什么是API?(看完你就理解了)
阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface, ...
- 这篇看完我得理解ES6中中常见语法
目录 前言 1let篇 1.1作用域 1.2变量提升 1.3相同作用域赋值 2const篇 3模板字符串篇 3.1传统 3.2模板字符串复制 4扩展运算符篇 4.1传统赋值 4.2扩展字符串复制 前言 ...
- storm的并行度的解释--- ( 看完就能理解 )
关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参 ...
最新文章
- 区分什么是Apache、Tomcat,之间有什么关系?
- php的VC9-VC14运行库分享以及localhost访问404问题
- change to port 80 instead of 8069
- 爬虫模拟登陆手机验证码_Python+scrapy爬虫之模拟登陆
- Linux shell编程:状态变量
- 2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力
- 网页html修改,对学生信息进行修改网页html代码.doc
- Jmeter VS LoadRunner
- excel怎么并排查看两个工作表
- 用Python2编译Python3.X的代码: __future__ 模块
- 脏写 脏读 不可重复读 幻读 读偏差 写偏差 丢失更新 示例
- SpringBoot+Shiro 学习之数据库动态权限管理和 Redis 缓存
- C语言猜数字游戏代码实现
- linux 安装触摸版驱动程序,在ubuntu和linux上配置触摸屏驱动程序启用触摸屏
- “大数据杀熟”将被明令禁止:亚马逊才是大数据杀熟算法的鼻祖
- 如何为水晶报表rpt文件添加数据连接
- 关于在窗体之间传值的问题 C# winform
- 虚拟机:centos在主机和虚拟机之间传输文件
- 计算机不通电维修,显示器不通电维修教程
- 适用于Android智能手机的6大数据保护应用