1、随机抽样一致算法(Random sample consensus,RANSAC)理论介绍

Ordinary LS是保守派:在现有数据下,如何实现最优。是从一个整体误差最小的角度去考虑,尽量谁也不得罪。

RANSAC是改革派:首先假设数据具有某种特性(目的),为了达到目的,适当割舍一些现有的数据。

给出最小二乘拟合(红线)、RANSAC(绿线)对于一阶直线、二阶曲线的拟合对比:

可以看到RANSAC可以很好的拟合。RANSAC可以理解为一种采样的方式,所以对于多项式拟合、混合高斯模型(GMM)等理论上都是适用的。

RANSAC的算法大致可以表述为(来自wikipedia):

Given:
data – a set of observed data points
model – a model that can be fitted to data points
n – the minimum number of data values required to fit the model
k – the maximum number of iterations allowed in the algorithm
t – a threshold value for determining when a data point fits a model
d – the number of close data values required to assert that a model fits well to data

Return:
bestfit – model parameters which best fit the data (or nul if no good model is found)

iterations = 0
bestfit = nul
besterr = something really large
while iterations < k {
maybeinliers = n randomly selected values from data
maybemodel = model parameters fitted to maybeinliers
alsoinliers = empty set
for every point in data not in maybeinliers {
if point fits maybemodel with an error smaller than t
add point to alsoinliers
}
if the number of elements in alsoinliers is > 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 alsoinliers
thiserr = a measure of how well model fits these points
if thiserr < besterr {
bestfit = bettermodel
besterr = thiserr
}
}
increment iterations
}
return bestfit
RANSAC简化版的思路就是:
第一步:假定模型(如直线方程),并随机抽取Nums个(以2个为例)样本点,对模型进行拟合:

第二步:由于不是严格线性,数据点都有一定波动,假设容差范围为:sigma,找出距离拟合曲线容差范围内的点,并统计点的个数:

第三步:重新随机选取Nums个点,重复第一步~第二步的操作,直到结束迭代:

第四步:每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果:

至此:完成了RANSAC的简化版求解。

这个RANSAC的简化版,只是给定迭代次数,迭代结束找出最优。如果样本个数非常多的情况下,难不成一直迭代下去?其实RANSAC忽略了几个问题:

每一次随机样本数Nums的选取:如二次曲线最少需要3个点确定,一般来说,Nums少一些易得出较优结果;
抽样迭代次数Iter的选取:即重复多少次抽取,就认为是符合要求从而停止运算?太多计算量大,太少性能可能不够理想;
容差Sigma的选取:sigma取大取小,对最终结果影响较大;

这些参数细节信息参考:维基百科

RANSAC的作用有点类似:将数据一切两段,一部分是自己人,一部分是敌人,自己人留下商量事,敌人赶出去。RANSAC开的是家庭会议,不像最小二乘总是开全体会议。

2、随机抽样一致算法(Random sample consensus,RANSAC)程序实现

附上最开始一阶直线、二阶曲线拟合的code(只是为了说明最基本的思路,用的是RANSAC的简化版):

一阶直线拟合:

clc;clear all;close all;set(0,'defaultfigurecolor','w');
%Generate data
param = [3 2];
npa = length(param);
x = -20:20;
y = param*[x; ones(1,length(x))]+3*randn(1,length(x));
data = [x randi(20,1,30);...y randi(20,1,30)];
%figure
figure
subplot 221
plot(data(1,:),data(2,:),'k*');hold on;
%Ordinary least square mean
p = polyfit(data(1,:),data(2,:),npa-1);
flms = polyval(p,x);
plot(x,flms,'r','linewidth',2);hold on;
title('最小二乘拟合');
%Ransac
Iter = 100;
sigma = 1;
Nums = 2;%number select
res = zeros(Iter,npa+1);
for i = 1:Iter
idx = randperm(size(data,2),Nums);
if diff(idx) ==0continue;
end
sample = data(:,idx);
pest = polyfit(sample(1,:),sample(2,:),npa-1);%parameter estimate
res(i,1:npa) = pest;
res(i,npa+1) = numel(find(abs(polyval(pest,data(1,:))-data(2,:))<sigma));
end
[~,pos] = max(res(:,npa+1));
pest = res(pos,1:npa);
fransac = polyval(pest,x);
%figure
subplot 222
plot(data(1,:),data(2,:),'k*');hold on;
plot(x,flms,'r','linewidth',2);hold on;
plot(x,fransac,'g','linewidth',2);hold on;
title('RANSAC');

二阶曲线拟合:

clc;clear all;set(0,'defaultfigurecolor','w');
%Generate data
param = [3 2 5];
npa = length(param);
x = -20:20;
y = param*[x.^2;x;ones(1,length(x))]+3*randn(1,length(x));
data = [x randi(20,1,30);...y randi(200,1,30)];
%figure
subplot 223
plot(data(1,:),data(2,:),'k*');hold on;
%Ordinary least square mean
p = polyfit(data(1,:),data(2,:),npa-1);
flms = polyval(p,x);
plot(x,flms,'r','linewidth',2);hold on;
title('最小二乘拟合');
%Ransac
Iter = 100;
sigma = 1;
Nums = 3;%number select
res = zeros(Iter,npa+1);
for i = 1:Iter
idx = randperm(size(data,2),Nums);
if diff(idx) ==0continue;
end
sample = data(:,idx);
pest = polyfit(sample(1,:),sample(2,:),npa-1);%parameter estimate
res(i,1:npa) = pest;
res(i,npa+1) = numel(find(abs(polyval(pest,data(1,:))-data(2,:))<sigma));
end
[~,pos] = max(res(:,npa+1));
pest = res(pos,1:npa);
fransac = polyval(pest,x);
%figure
subplot 224
plot(data(1,:),data(2,:),'k*');hold on;
plot(x,flms,'r','linewidth',2);hold on;
plot(x,fransac,'g','linewidth',2);hold on;
title('RANSAC');

参考:
1:https://en.wikipedia.org/wiki/Random_sample_consensus
2:http://www.cnblogs.com/xingshansi/p/6763668.html

随机抽样一致算法(RANSAC)理论介绍和程序实现相关推荐

  1. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  2. 随机抽样一致算法(Random sample consensus,RANSAC)

    作者:桂. 时间:2017-04-25  21:05:07 链接:http://www.cnblogs.com/xingshansi/p/6763668.html 前言 仍然是昨天的问题,别人问到最小 ...

  3. 四旋翼姿态解算——互补滤波算法及理论推导

    转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接:http://blog.csdn.net/hongbin_xu ...

  4. 史上最全GAN综述2020版:算法、理论及应用(A Review on Generative Adversarial Networks: Algorithms, Theory, and Applic)

    ** ** 史上最全GAN综述2020版:算法.理论及应用** 论文地址:https://arxiv.org/pdf/2001.06937.pdf ** 摘要:生成对抗网络(GANs)是近年来的一个研 ...

  5. MPI介绍与实践——理论介绍

    MPI介绍与实践--理论介绍 一.MPI介绍 1.什么是MPI Message Passing Interface Specification(消息传递接口规范) MPI是由一组来自学术界和工业界的研 ...

  6. [转]Paxos算法-算法形成理论

    paxos的作者自述paxos is simple,看了不少遍还没有读懂,说明真的不simple 还好有强大的网络,转篇齐全的 原文地址:http://blog.csdn.net/chen77716/ ...

  7. 北大「最优化:建模、算法与理论」新书, 附579页电子版与课件

    最优化计算方法是运筹学.计算数学.机器学习和数据科学与大数据技术等专业的一门核心课程.通过本书的学习,掌握最优化的基本概念,最优性理论,典型的几类最优化问题(如凸优化,无约束优化,约束优化,复合优化等 ...

  8. 史上最全GAN综述2020版:算法、理论及应用

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 转载自:机器之心 自从 2014 年 Ian GoodFellow 提出 GAN ...

  9. 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...

    来源:专知 [导读]生成式对抗网络(Generative Adversarial Networks,GANs)作为近年来的研究热点之一,受到了广泛关注,每年在机器学习.计算机视觉.自然语言处理.语音识 ...

最新文章

  1. jQuery插件开发(一):jQuery类方法
  2. SAP Spartacus cxOutlet 里的 templatesRefs 的填充逻辑
  3. hdu_2048 错排问题
  4. 谈一下关于CQRS架构如何实现高性能
  5. xdebug断点调试原理
  6. Markdown(五)——绘图工具mermaid之流程图Flowchart
  7. redis 实战系列(一)
  8. 在内部架设NuGet服务器
  9. 软件使用,Microsoft Visual C++运行库合集包
  10. oracle数据库课后报告,ORACLE数据库课程设计报告
  11. 太阳能充电板给锂电池充电电路设计
  12. windows10安装更新很慢ndows,win10系统更新后运行速度变慢的解决方法 - 系统家园...
  13. Ubuntu20.04安装五笔、拼音混合输入法
  14. C语言程序 输出杨辉三角,C语言打印输出杨辉三角
  15. sklearn.metrics.confusion_matrix
  16. 百度站长平台做https认证总是通不过,验证失败如何解决
  17. 婴儿电动摇篮车摇篮床单芯片蓝牙芯片IC方案
  18. Java面试题(上)
  19. 实战PyQt5: 143-QChart图表之堆积柱状图
  20. 中秋赏月地图出炉,跟随锦江之星去赏月

热门文章

  1. 怎样在Android上手动备份你的短信/彩信?
  2. Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 359404 bytes) in
  3. 第一行代码(第二版)全书代码下载
  4. URL(待整合到HTTP书中哦)
  5. 【转】写给想学习自动化测试的新人
  6. Qtopia-2.2.0启动脚本
  7. ARP***防范与解决方案
  8. 详解HelloWorldBasic实例
  9. linux的日志系统,Linux上的日志系统
  10. PTA-7-1 输出大写英文字母 (15分)(C语言)