随机抽样一致(RANSAC)算法及matlab实现
一、算法介绍
RANSAC为RANdom SAmple Consensus(随机抽样一致)的缩写,它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。它于1981年由Fischler和Bolles最先提出。
RANSAC算法的应用背景是在一堆观察点中估计出某个模型 y y y。
以2D模型为例,RANSAC算法要估计 数据的最优模型 y = a x + b y=ax+b y=ax+b 。
二、算法步骤
Step1:随机抽取n个数据
从样本集合中取出n个数据。然后用这n个点去实例化模型,并将仿射变换计算出来。这个计算过程可以使用最小二乘法等等不限。需要注意的是,在选取n的时候,要随机选择最小数量的点以尽可能高的效率来检测可能的模型。例如如果模型是直线型,则 n = 2 n=2 n=2。
如果 n n n超过了最小数量,会带来如下缺点:
1.计算复杂性增加。每次迭代需要选择和处理更多的点,这可能导致算法运行速度变慢。对于直线来说,任何两点都可以确定一条直线,所以选择超过两点会增加不必要的计算。
2.更容易受到异常值的影响。如果随机选择三个点,并且其中两个是异常值,那么通过这三个点确定的直线可能会受到异常值的严重影响。而如果你只选择两个点,异常值对结果的影响可能会减少。
3.可能会导致过拟合。如果数据集中有很多异常值,使用更多的点来确定模型可能会导致模型过于复杂,从而更容易拟合到这些异常值,这被称为过拟合。
Step2:计算所有点到模型的距离di与距离门限(threshold)的距离t
定义内点*(inliers)和外点(outliers)*,其中内点可以被认为正确数据,即可以被模型描述的数据;外点可以被认为异常数据,即偏离正常范围很远、无法适应数学模型的数据。
{ ∣ d i ∣ < t , i = inlier; ∣ d i ∣ ≥ t , i = outlier; (1) \begin{cases}|d_i| < t, \text{i = inlier;} \\ |d_i| ≥ t, \text{i = outlier;} \\ \end{cases} \tag{1} {
∣di∣<t,i = inlier;∣di∣≥t,i = outlier;(1)
Step3:寻找最优模型
统计inliers的数量,记为Si,定义数量门限为T。if Si≥T,则认为此模型是合格的模型。即可以用这Si个inliers去重新估计模型*(re-estimate the model)。if Si < T,则重复Algorithm1-3,重新计算模型、求inliers和outliers*,直到得到合格的模型。
由于之前的model是由n个data所估计得到,而全部数据计算得到的inliers的数量Si一定大于n。则此时所估计出的新模型的准确度一定高于之前用n个数据所估计的旧模型。
Step4:重复N次试验(repeat for N trials)
在N次重复试验中,每次会存在一个Sij(1≤j≤N)。然后在此之中选择拥有最大的内点个数*Simax*的模型,作为最优估计模型。
这里存在两个问题:
1、如何判断两个门限t和T。t会影响内点个数,而T又会因环境不同而有不同取值。
2、如何定义重复次数N。
三、距离门限t的选择
假设数据 X = [ X 1 , X 2 ] X=[X_1, X_2] X=[X1,X2]服从方差为 σ \sigma σ的高斯分布。则其到模型的距离之平方服从卡方分布(chi-square distribution)。
X 1 s i 2 + X 2 s i 2 = d s i 2 ∼ χ 2 ( 2 ) (2) X_{1si}^2+X_{2si}^2=d_{si}^2 \sim \chi^2(2) \tag{2} X1si2+X2si2=dsi2∼χ2(2)(2)
其中, X 1 s X_{1s} X1s和 X 2 s X_{2s} X2s分别代表对数据 X X X的标准化后得到的二维数据, d s i d_{si} dsi是标准化后的距离。定义标准化门限距离 t s t_s ts,计算距离平方 d i s 2 < t s 2 d_{is}^2<t_s^2 dis2<ts2的概率,此概率满足下式累积分布函数(CDF):
F ( x ∣ k ) = P ( X ≤ x ) = 1 Γ ( m 2 ) ∫ 0 x t m 2 −