RANSAC算法实现 + 直线拟合

一、RANSAC算法

1.参考资料

[1]题目来源与解析:商汤科技SLAM算法岗的RANSAC编程题

[2]牛客网题目:[编程题]线性回归

[3]牛客网解答参考:商汤科技某算法岗的编程题有点过分了啊

[4]RANSAC算法原理:RANSAC翻译、经典RANSAC以及其相关的改进的算法小结

[5]参考代码(只进行两点的估计):RANSAC 直线拟合算法

[6]最小二乘拟合直线原理:最小二乘法直线拟合:Ax+By+C=0

[7]最小二乘拟合直线代码:Ax+By+C=0 直线一般式拟合 c++/python

[8]最小二乘原理推导:最小二乘法求回归直线方程的推导过程

 

2.题目要求

拟合二维平面中的带噪音直线, 
其中有不超过10%的样本点远离了直线,另外90%的样本点可能有高斯噪声的偏移
要求输出为 
ax+by+c=0的形式 
其中a > 0 且 a^2 + b^2 = 1

输入描述:
第一个数n表示有多少个样本点  之后n*2个数 每次是每个点的x 和y

输出描述:
输出a,b,c三个数,至多可以到6位有效数字

示例1
输入
5
3 4
6 8
9 12
15 20
10 -10

输出
-0.800000 0.600000 0.000000
说明
本题共有10个测试点,每个点会根据选手输出的参数计算非噪音数据点的拟合误差E,并根据E来对每个数据点进行评分0-10分
输入数据的范围在-10000

3.RANSAC算法伪代码(转自[4])

伪码形式的算法如下所示: 
输入: 
data —— 一组观测数据 
model —— 适应于数据的模型 
n —— 适用于模型的最少数据个数 
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_consensus_set = consensus_set
            best_error =  this_error
    增加迭代次数
返回 best_model, best_consensus_set, best_error

3.最小二乘求解直线

公共内容:

变量名 计算公式
mX
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值