1.算法描述

RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
    局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
    RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

通俗来说就是用RANSAC算法处理一批含有噪音的点,如一批数据有M个点,其中Q个点是有噪音的,即局外点。每一个点我们都可以用(x,y)来表示。

1.首先我们会根据数据提出一个模型来拟合局内点。如f(x) = 0或f(x) = y,这个假设模型的参数需要我们后续求取。由于Q个点是局外点,并不影响我们的模型参数,因此只要剩下M-Q个点满足f(x) < ε,就认为假设的模型是合理的,其中ε是我们设定的阈值,可以理解为误差。

2.此处假设f(x)为一个线性模型,即y = ax + b。由于线性模型是一条直线,只需根据两点即可确定。我们在M个点中随机取出两个点,求出a和b,即可得到一个假设线性模型。

3.对于剩下M-2个点,依次代入我们假设的模型中,计算假设模型的y值与真实y值之间的距离,如果距离小于ε,则我们认为该点为内点,即|ax +b - y| < ε。若内点很少,则返回第二步,重新采点,生成新的假设模型进行计算。此处有两种方案,第一种是迭代足够多的次数,记录内点的数量,迭代完成后内点最多的模型即为最终我们想要的模型。第二种是设定一个阈值,如我们有500个点,如果内点个数为400,就认为当前模型可以拟合足够多的内点,跳出循环。

说句实话,清爽的八得了。

2.代码实现

下面就用实现一个线性回归的RANSAC算法代码。

import numpy as np
from matplotlib import pyplot as plt
import random#生成数据集
SIZE = 50
OUT = 20
X = np.linspace(0, 10, 50)
Y = [3 * i + 10 + 2 * random.random() for i in X[:-OUT]] + [random.randint(0, int(i)) for i in X[-OUT:]]
X_data = np.array(X)
Y_data = np.array(Y)

用matplotlib可视化出来,数据看起来是这样的。

很明显,左上角为内点,右下角为外点,即噪音。

# 选点、评估iters = 1000
epsilon = 5
threshold = 0.8
best_a, best_b = 0, 0
pre_total = 0
for i in range(iters):sample_index = random.sample(range(SIZE), 2)x_1 = X_data[sample_index[0]]x_2 = X_data[sample_index[1]]y_1 = Y_data[sample_index[0]]y_2 = Y_data[sample_index[1]]a = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1total_in = 0  #内点计数器for index in range(SIZE):y_estimate = a * X_data[index] + bif abs(y_estimate - Y_data[index]) < epsilon: #符合内点条件total_in += 1if total_in > pre_total:  #记录最大内点数与对应的参数pre_total = total_inbest_a = abest_b = bif total_in > SIZE * threshold: #内点数大于设定的阈值,跳出循环breakprint("迭代{}次,a = {}, b = {}".format(i, best_a, best_b))

也可以通过plt可视化一下

    x_line = np.linspace(0, 10, 1000)y_line = best_a * x_line + bplt.plot(x_line, y_line, c = 'r')plt.scatter(X_data, Y_data)plt.show()

最终拟合结果如下:

RANSAC算法详解+Python实现相关推荐

  1. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  2. 基于多相滤波器的数字信道化算法详解(Python, Verilog代码已开源)

    基于多相滤波器的数字信道化算法详解 推导过程 总结 仿真 本文详细介绍了基于多相滤波器的数字信道化算法的推导过程, 如果您在阅读的过程中发现算法推导过程中有任何错误, 请不吝指出. 此外, 进入我的G ...

  3. 机器视觉:ransac算法详解

    一.说明: 在线性回归问题中,采样点具备明显的线性相关性:如下图左.然而有些情性中,噪声很大,线性性散布在非线性点的噪声中,将无法用线性回归 的方法进行直线提取. 随机样本一致性 (RANSAC) 是 ...

  4. 非极大值抑制(nms)算法详解[python]

    一.起源 目标检测在使用了基于深度学习的端到端模型后效果斐然.目前,常用的目标检测算法,无论是One-stage的SSD系列算法.YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大 ...

  5. PatchMatch算法详解(python代码实现)

    一.简介 patchmatch算法的核心目的是在两张图片之间快速寻找对应的小区域.在应用上,patchmatch算法可以结合图像重组等技术,来实现诸如图像修复.图片融合.去水印等功能. patch是指 ...

  6. FCM聚类算法详解(Python实现iris数据集)

    参考:https://blog.csdn.net/on2way/article/details/47087201 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚 ...

  7. 一文速学数模-聚类模型(一)K-means聚类算法详解+Python代码实例

    目录 前言 一.聚类分析 二.K-means原理 1.距离度量算法 欧几里得距离(欧氏距离)

  8. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

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

  9. AdaBoost算法详解与python实现

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

  10. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

最新文章

  1. php屏蔽审查元素,前端:屏蔽F12审查元素,禁止修改页面代码
  2. Linux从零开始(二、基础命令(续二)解压 tar)
  3. 第九十九期:可以编写代码的代码:代码生成的利与弊
  4. 深度学习环境搭建之Anaconda安装keras
  5. Adobe illustrator 剪切蒙版圆形细胞培养皿 - 连载20
  6. 维护老客户,比发展新客户,成本要低得多
  7. 第3章 正则表达式1
  8. dual mysql 获取序列_如何获取 MySQL 插入数据的自增 ID
  9. 计算机主机光驱弹不出来怎么办,win7系统电脑按下光驱按钮托盘就是弹不出来怎么办...
  10. Altium Designer入门教程:软件安装、中文设置与原件库配置
  11. 如何判断某个类是否有某个注解?
  12. 【高数复盘】2.1导数概念
  13. 【R语言】——VennDiagram包绘制维恩图(保姆级教程)
  14. js数字转字符串和字符串转数字的方法
  15. 解决在ceph对象网关中使用s3fs报错“unable to access MOUNTPOINT /s3: Transport endpoint is not connected”
  16. abel 登陆不了_封印者登录不了怎么办 三大登陆难题解决
  17. wrf模式数据变量说明
  18. 远程控制软件哪家好?六款主流远控软件全方位测评
  19. 9个offer12家公司35场面试从微软到谷歌
  20. CSS实现微信对话框

热门文章

  1. SOUI中View类型的控件数据更新的例子
  2. HDU 4289 Control (最大流最小割)
  3. 信息论——最大流最小割定理
  4. 《计算机组成原理》第二版第七章课后习题答案
  5. java 读取换行_Java中的换行字符读取 - java
  6. 智慧城市发展路径应分级分类
  7. hive sql 添加字段以及修改字段
  8. Vue项目:电商后台管理管理系统
  9. uni-app项目的启动
  10. log4j2自定义级别日志