随机抽样一致性算法(RANSAC)详解

转载连接:https://www.jianshu.com/p/864fb240af70

它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。该算法最早由Fischler和Bolles于1981年提出。

1. Example

一个简单的例子是从一组观测数据中找出合适的2维直线。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反,RANSAC能得出一个仅仅用局内点计算出模型,并且概率还足够高。但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的参数。
在这里插入图片描述

2. RANSAC基本假设

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

3. 概述

RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:

  • 采样出假设的局内点,计算出一个模型,即模型所有的未知参数都能从假设的局内点计算得出。
  • 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
  • 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
  • 然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。(进行迭代)
  • 最后,通过估计局内点与模型的错误率来评估模型。

这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

4. 算法

输入:

data // 一组观测数据
model // 适应于数据的模型
n // 适应于模型的最少数据个数,如果是直线的话,n=2
k // 算法的迭代次数
t // 用于决定数据是否应用于模型的阈值
d // 判定模型是否适用于数据集的数据个数,人为设定

输出:

best_model // 跟数据最匹配的模型参数(如果没有好的模型,返回null)
best_consensus_set // 估计出模型的数据点
best_error // 跟数据相关的估计出的模型错误
伪

代码如下:

iterations = 0
best_model = null
best_consensus_set = null
best_error = 无穷大
while(iterations < k)
  maybe_inliers = 从数据集中随机选择n个点
  maybe_model = 适合于maybe_inliers的模型参数
  consensus_set = maybe_inliers

  for(每个数据集中不属于maybe_inliers的点)
    if(如果点适合于maybe_model,且错误小于t)
      将点添加到consensus_set
  if(consensus_set中的元素数目大于d)
    已经找到好的模型,现在测试该模型到底有多好
    better_model = 适合于consensus_set中所有点的模型参数
    this_error = better_model究竟如何适合这些点的度量
    if(this_error < best_error)
      我们发现了比以前更好的模型,保存该模型直到更好的模型出现
      best_model = better_model
      best_error = this_error
      best_consensus_set = consensus_set
    if(this_error < t)
      break
  iteration++
return best_model, best_consensus_set, best_error

RANSAC算法的可能变化包括以下几种:
(1)如果发现了一种足够好的模型(该模型有足够小的错误率),则跳出主循环。这样可能会节约计算额外参数的时间。
(2)直接从maybe_model计算this_error,而不从consensus_set重新估计模型。这样可能会节约比较两种模型错误的时间,但可能会对噪声更敏感。

5. 参数的确定

用于决定数据是否适应于模型的阀值 t 和判定模型是否适用于数据集的数据个数 d 是需要根据特定的问题和数据集通过实验来确定的。然而参数k(迭代次数)可以从理论结果推断。
以下参数符号与文章第4部分有出入。
p —— desired probablity that we get a good sample(得到的模型中没有外点的概率)
e —— probablity that a point is an outlier
s —— number of points in a sample (要估计的数学模型需要的参数个数,如果是直线,那么s=2)

choose k such that with p=0.99 at least on random sample is not an outlier.
以上就是通过设定要得到的模型中没有外点的概率p,计算得到的所需迭代次数k。
​ (1-e) 为这个点不是外点的概率
​ (1-e)^s 为模型所需的s个点都不是外点的概率
​ 1-(1-e)^s 为模型所需的s个点至少有一个点是外点的概率
因为P(A,B) = P(A)P(B),
​ (1-(1-e)s)k 表示算法永远都不会选择到s个点都不是inlier的概率,也就是迭代过程中永远有外点,=1-p

6. 优点和缺点

RANSAC的优点是它能鲁棒的估计模型参数。例如,它能从包含大量局外点的数据集中估计出高精度的参数。RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。
RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值