RANSAC (Random Sample Consensus)

问题描述: 已知一个点集S,包含N个点,目标是拟合出一个直线L,使最多的点在L上

求解:最小二乘法应该是第一个候选方法,如果不考虑噪声,最小二乘法给出的就是在MSE误差下的最优解。

如果点集S中包含一定的噪声点,最小二乘法的结果将受噪声影响,偏离最优解,此时RANSAC是一个更好的

方法。RANSAC的步骤如下

步骤1. 从S中随机抽取2个点,用最小二乘法拟合出直线L

步骤2. 计算S中属于L的点的个数n

步骤3. 如果n/N > T (T是一个人工选择的阈值,表示对L的置信度),则输出L,转步骤4,否则转步骤1

步骤4. 令在L上的点构成集合V,利用集合V重新拟合出一个直线Lv (最小二乘或SVD分解),输出Lv,结束

显然参数T是一个关键参数,和具体问题相关:

T太小,则可能无法输出最优直线L; T太大,则可能没有直线L满足条件

另外点集S中点的数目N如果比较大,则循环次数比较多,算法速度会很慢

RANSAC是一个随机算法,从概率的角度考虑其收敛问题:S中噪声点的比例是a, 即有a*N个点是噪声点,(1-a)*N是真正的数据点,则算法尝试k次后,至少有一次尝试的两个点都不是噪声点的概率

Pr = 1 - ((1 - a)^2)^k

令Pr > P则有 (一般P>0.95即可)

k < log(1 - P) /  (2 * log(1-a))

所以RANSAC的用户参数T可以用(P,a)替代,其中P是对结果的置信度,a是对点集S中噪声水平的估计,则步骤3修改成如下形式

步骤3. 如果迭代次数k超过log(1-P) / (2 * log(1-a))则转步骤4,输出经过点数最多的一个结果L (概率意义下满足P的限制)


上述以拟合直线为例,所以确定一个模型需要2个点,对于复杂的模型,参数增多,需要的点数也就增多,一般利用SVD确定模型参数,奇异值和特征值类似,都是表示矩阵本质的一些特性。用矩阵形式表示模型参数的估计AX=B其中X是1维列向量,表示模型参数,B也是一维列向量,A是系数矩阵,一般不是方阵,所以不能直接求特征值。一般A的行数大于列,是一个超定方程组。根据SVD定义,矩阵A = N * E * M 其中E是对角阵,对角线上的就是A的奇异值(对超定方程有0存在),N和M都是对称的对角阵,所以

X = M^(-1)*E^(-1)*N^(-1)*B

因为E中存在0,上式中假设E中0的倒数是0本身,其实上式利用了广义逆


关于SVD和齐次方程组(和RANSAC没有直接关系,但通过增加X的维度,非齐次可以转换成齐次)

AX=B当B=0时成为齐次方程组,此时X=0是一个解,但是我们往往关心的是满足|X| = 1的解

AX = 0 -> A'AX = 0 -> CX = 0

其中A'是A的转置,C是方阵,此时目标是

MIN(|CX|) for all X

subject to |X|=1

求解:

不要去考虑拉格朗日乘子,C是可逆的,有特征值,满足CZ = cZ,其中c是特征值,z是特征向量,显然

MIN(|CX|) -> MIN(cX)

即C的最小特征值min(c),令MIN(|CX|)成立,而且min(c)对应的特征向量就是满足约束条件的X




你可能感兴趣的:(math)