之前只是简单了解RANSAC模型,知道它是干什么的。然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合。

RANSAC简介

RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Proble)问题的。

对于RANSAC算法来说一个基本的假设就是数据是由“内点”和“外点”组成的。“内点”就是组成模型参数的数据,“外点”就是不适合模型的数据。同时RANSAC假设:在给定一组含有少部分“内点”的数据,存在一个程序可以估计出符合“内点”的模型。以上文字翻译于wiki,并加有一些博主自己的理解。

算法基本思想和流程

RANSAC是通过反复选择数据集去估计出模型,一直迭代到估计出认为比较好的模型。

具体的实现步骤可以分为以下几步:选择出可以估计出模型的最小数据集;(对于直线拟合来说就是两个点,对于计算Homography矩阵就是4个点)

使用这个数据集来计算出数据模型;

将所有数据带入这个模型,计算出“内点”的数目;(累加在一定误差范围内的适合当前迭代推出模型的数据)

比较当前模型和之前推出的最好的模型的“内点“的数量,记录最大“内点”数的模型参数和“内点”数;

重复1-4步,直到迭代结束或者当前模型已经足够好了(“内点数目大于一定数量”)。

迭代次数推导

这里有一点就是迭代的次数我们应该选择多大呢?这个值是否可以事先知道应该设为多少呢?还是只能凭经验决定呢? 这个值其实是可以估算出来的。下面我们就来推算一下。

假设“内点”在数据中的占比为

那么我们每次计算模型使用

个点的情况下,选取的点至少有一个外点的情况就是

也就是说,在迭代

次的情况下,

就是

次迭代计算模型都至少采样到一个“外点”去计算模型的概率。那么能采样到正确的

个点去计算出正确模型的概率就是

通过上式,可以求得

“内点”的概率

通常是一个先验值。然后

是我们希望RANSAC得到正确模型的概率。如果事先不知道

的值,可以使用自适应迭代次数的方法。也就是一开始设定一个无穷大的迭代次数,然后每次更新模型参数估计的时候,用当前的“内点”比值当成

来估算出迭代次数。

用Python实现直线拟合

import numpy as np

import matplotlib.pyplot as plt

import random

import math

# 数据量。

SIZE = 50

# 产生数据。np.linspace 返回一个一维数组,SIZE指定数组长度。

# 数组最小值是0,最大值是10。所有元素间隔相等。

X = np.linspace(0, 10, SIZE)

Y = 3 * X + 10

fig = plt.figure()

# 画图区域分成1行1列。选择第一块区域。

ax1 = fig.add_subplot(1,1, 1)

# 标题

ax1.set_title("RANSAC")

# 让散点图的数据更加随机并且添加一些噪声。

random_x = []

random_y = []

# 添加直线随机噪声

for i in range(SIZE):

random_x.append(X[i] + random.uniform(-0.5, 0.5))

random_y.append(Y[i] + random.uniform(-0.5, 0.5))

# 添加随机噪声

for i in range(SIZE):

random_x.append(random.uniform(0,10))

random_y.append(random.uniform(10,40))

RANDOM_X = np.array(random_x) # 散点图的横轴。

RANDOM_Y = np.array(random_y) # 散点图的纵轴。

# 画散点图。

ax1.scatter(RANDOM_X, RANDOM_Y)

# 横轴名称。

ax1.set_xlabel("x")

# 纵轴名称。

ax1.set_ylabel("y")

# 使用RANSAC算法估算模型

# 迭代最大次数,每次得到更好的估计会优化iters的数值

iters = 100000

# 数据和模型之间可接受的差值

sigma = 0.25

# 最好模型的参数估计和内点数目

best_a = 0

best_b = 0

pretotal = 0

# 希望的得到正确模型的概率

P = 0.99

for i in range(iters):

# 随机在数据中红选出两个点去求解模型

sample_index = random.sample(range(SIZE * 2),2)

x_1 = RANDOM_X[sample_index[0]]

x_2 = RANDOM_X[sample_index[1]]

y_1 = RANDOM_Y[sample_index[0]]

y_2 = RANDOM_Y[sample_index[1]]

# y = ax + b 求解出a,b

a = (y_2 - y_1) / (x_2 - x_1)

b = y_1 - a * x_1

# 算出内点数目

total_inlier = 0

for index in range(SIZE * 2):

y_estimate = a * RANDOM_X[index] + b

if abs(y_estimate - RANDOM_Y[index]) < sigma:

total_inlier = total_inlier + 1

# 判断当前的模型是否比之前估算的模型好

if total_inlier > pretotal:

iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE * 2), 2))

pretotal = total_inlier

best_a = a

best_b = b

# 判断是否当前模型已经符合超过一半的点

if total_inlier > SIZE:

break

# 用我们得到的最佳估计画图

Y = best_a * RANDOM_X + best_b

# 直线图

ax1.plot(RANDOM_X, Y)

text = "best_a = " + str(best_a) + "\nbest_b = " + str(best_b)

plt.text(5,10, text,

fontdict={'size': 8, 'color': 'r'})

plt.show()

最后得到结果如下图:RANSAC拟合曲线效果RANSAC算法详解(附Python拟合曲线和平面)​lixin97.com

python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)相关推荐

  1. kmeans算法详解和python代码实现

    kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...

  2. AdaBoost算法详解与python实现

    AdaBoost算法详解与python实现 https://tangshusen.me/2018/11/18/adaboost/

  3. RRT(Rapidly-Exploring Random Trees)算法详解及python实现

    RRT(Rapidly-Exploring Random Trees)算法详解及python实现 前言 一.原理 二.伪代码 三.代码详解 总结 前言 快速探索随机树(RRT):作为一种随机数据结构, ...

  4. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  5. Simhash算法详解及python实现

    Simhash算法详解及python实现 GoogleMoses Charikar发表的一篇论文"detecting near-duplicates for web crawling&quo ...

  6. 编辑距离算法详解和python代码

    编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...

  7. python怎么导入文件-Python文件如何引入?详解引入Python文件步骤

    python基本语法--引入Python文件 1.新建python文件 :在同目录lib下创建mylib.py和loadlib.py两个文件 2.在mylib.py文件中创建一个Hello的类 并且给 ...

  8. 敏感词或关键词过滤,DFA算法详解及python代码实现

    一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...

  9. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

最新文章

  1. python opencv 检测特定颜色
  2. 《25项最优时间管理工具与技巧》
  3. 如何用js得到当前页面的url信息方法
  4. swagge php token,swagger在thinkphp6的使用方式
  5. linux spring mvc tomcat配置,Spring MVC配置详解
  6. Oracle 12.1.0.1 GI+DATABASE打PSU
  7. TypeScript极速完全进阶指南-2中级篇
  8. 正阅读微信小说分销系统-视频教程-4.数据统计 包含图文教程
  9. 机器学习之层次聚类及代码示例
  10. vue图片加载不出来的问题
  11. 再生龙备份linux文件多大,使用再生龙Clonezilla备份还原Linux系统
  12. 跨境电商适合做独立站吗,是入平台好还是独立站好?
  13. oracle crs 4563,重启机器后,节点2无法启动crs,Oracle你生产的RAC为何如此的脆弱,有图有真相。求解...
  14. macOS中调整终端默认窗口大小
  15. 有哪一些测不准原理?
  16. 【C++】-- STL之unordered_map/unordered_set详解
  17. 站在QA的角度浅谈软件测试流程
  18. CISCO PT IP电话7960 LAB
  19. 深搜(DFS)和宽搜(BFS)
  20. 智能ABC输入法的三个小秘密

热门文章

  1. 关于GoJs的总结及多功能实例
  2. Java字符串的“朝花夕拾”
  3. Python Class 详解
  4. java 中文字体_Java的中文字体
  5. UI设计师们都有哪些顺手的APP
  6. list-style-type 去除li 前面的标记(小黑点)
  7. 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯...
  8. 《浪潮之巅》读后感系列
  9. 冻结窗口怎么冻结两行_冻结还是模糊? 捕捉摄影运动的两种方法
  10. 中国胶原蛋白多肽市场前景动态分析及投资方向建议报告2022-2028年