【机器学习】鲁棒(健壮)回归-RANSAC(Random Sample Consensus)算法

embedded/2025/1/20 23:53:55/

RANSAC算法

RANSAC(Random Sample Consensus)是一种用于估计数据中包含异常值时的模型参数的迭代算法,特别适用于数据包含噪声或离群点的情况。


核心思想

RANSAC通过随机采样和一致性验证来找到能够最大化拟合数据模型的参数,重点在于对离群点的鲁棒性。

  1. 随机采样
    从数据集中随机选择一小部分点,假设这些点不包含离群点。

  2. 模型拟合
    用选定的样本点拟合模型。

  3. 一致性验证
    验证剩余点是否符合该模型(即它们是否在模型定义的误差范围内)。

  4. 评估模型
    计算当前模型的一致性点数,并记录符合度最高的模型。

  5. 重复迭代
    重复上述过程一定次数,直到找到最佳模型。


优缺点

优点
  • 对数据中的离群点具有很强的鲁棒性。
  • 适用于各种模型(如直线、平面或更复杂的非线性模型)的拟合。
缺点
  • 算法结果可能受随机性影响(需要足够多的迭代次数)。
  • 当数据中的离群点比例过高时,可能难以找到正确的模型。

RANSAC算法的伪代码

输入:数据集、模型类型、最大迭代次数、误差阈值
输出:最佳模型参数1. 初始化:- best_model ← None- max_inliers ← 02. 循环 max_iterations 次:a. 从数据集中随机选择子集 sample_pointsb. 使用 sample_points 拟合模型 modelc. 计算所有点到 model 的误差d. 识别误差小于 threshold 的内点集合 inlierse. 如果 inliers 的数量大于 max_inliers:- 更新 max_inliers ← inliers 的数量- 更新 best_model ← 当前 model3. 返回 best_model


Python实现:RANSAC用于直线拟合

以下是一个简单的代码示例,演示如何用 RANSAC 进行直线拟合:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import RANSACRegressor
from sklearn.datasets import make_regressionplt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False# 生成数据(包含离群点)
np.random.seed(42)
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = 2 * X.squeeze() + np.random.normal(0, 0.5, X.shape[0])# 添加离群点
outliers = np.random.choice(X.shape[0], size=20, replace=False)
y[outliers] += np.random.normal(10, 5, size=len(outliers))# 可视化数据
plt.scatter(X, y, color="blue", label="数据点")
plt.xlabel("X")
plt.ylabel("y")
plt.title("带离群点的数据")
plt.show()# 使用 RANSAC 拟合
ransac = RANSACRegressor()
ransac.fit(X, y)
y_ransac = ransac.predict(X)# 绘制结果
plt.scatter(X, y, color="blue", label="数据点")
plt.plot(X, y_ransac, color="red", label="RANSAC拟合直线")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.title("RANSAC拟合结果")
plt.show()# 输出拟合结果
inlier_mask = ransac.inlier_mask_
outlier_mask = ~inlier_mask
print(f"内点数:{np.sum(inlier_mask)}, 外点数:{np.sum(outlier_mask)}")


运行结果

  1. RANSAC拟合结果

    • 红色直线表示 RANSAC 模型的拟合结果。
    • 蓝色散点包括原始数据点和离群点。
  2. 内点与外点统计

    内点数:87, 外点数:13
    • RANSAC 能够有效区分内点和外点,拟合结果不受离群点影响。

RANSAC的应用领域

  1. 计算机视觉
    • 估计图像特征之间的变换(如单应性矩阵、基本矩阵)。
  2. 机器人导航
    • 激光雷达点云拟合平面或直线。
  3. 信号处理与工程
    • 对噪声信号中的模型参数估计。
  4. 统计学与机器学习
    • 构建鲁棒模型,减少异常数据对结果的影响。

http://www.ppmy.cn/embedded/155619.html

相关文章

网络协议基础--协议分层

一.协议概述 1.TCP/IP 传输协议概述 TCP/IP 传输协议,即传输控制 / 网络协议,也被称作网络通讯协议。它是网络中使用的最基本通信协议,对互联网中各部分进行通信的标准和方法予以规定。通常所说的 TCP/IP 协议并非仅指 TCP 和 IP 两个协议&a…

【书生大模型实战营】Git 基础知识-L0G3000

本文是书生大模型实战营系列的第三篇文章,本文的主题是:Git基础知识点。 原始教程链接:Tutorial/docs/L0/git/readme.md at camp4 InternLM/Tutorial 1.Git总览 什么是Git? Git是一个分布式版本控制系统,广泛用于…

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架

前言 在过 2 个月即将进入 3 月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友跳槽面试,无论一面还是二面,都开始考验一个 Java 程序员的技术功底…

去哪儿kafka优化案例

一、背景介绍 集群概况 去哪儿旅行当前KAFKA日志集群节点145台。单机配置:3TSSD盘,40核,128G内存。 业务背景 日志KAFKA集群承载了全司的APPCODE日志,比如我们常用的QTRACE日志,以及实时离线数仓数据。体量非常大。…

精通Python (13)

一,进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中,讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分,因为当时主要的工作重心不在这里,但在实现过程中,发现地…

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装,如何暴露这些打包配置呢?上篇写到在package.json中的scripts配置项中有eje…

ubuntu 22 安装vmware 17.5

因为玩小车,亚博售后说目前技术不支持搭建移植环境,推荐使用官方的虚拟机镜像。 ubuntu安装linux, 下载,推荐 CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop/ws/17.5.1/23298084/linux/core 官方网站brandcom注册…