一、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 |