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

ops/2025/1/17 13:54: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/ops/150818.html

相关文章

javascript浏览器实现内容复制

function copyTextToClipboard(text) { // 使用Clipboard API的writeText方法复制文本到剪贴板 navigator.clipboard.writeText(text).then(function() { console.log(文本已成功复制到剪贴板); }).catch(function(err) { console.error(无法复制文本:…

WebScoket-服务器客户端双向通信

1. 消息推送常用方式介绍 轮询 浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。 长轮询 浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。 SSE server-sent-event:服…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架,旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器,Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

冯·诺依曼体系结构:计算机科学的奠基石

文章目录 前言🎷一、冯诺依曼体系结构(Von Neumann Architecture)🎸1.1 硬件介绍🥁1. 输入设备🥁2. 输出设备🥁3. 输入输出一体化设备🥁4. 存储器🥁5. 中央处理器CPU&…

【linux性能优化】系统启动参数

grubby -c /boot/grub2/grub.cfg --update-kernelALL --args“raidnoautodetect swiotlb16384 crashkernel16M,low crashkernel512M,high modprobe.blacklistvirtio_net transparent_hugepagenever acpi_force_table_verification” grubby:该工具用于更新和管理GR…

web前端第六次作业---制作网页页面

制作网页页面 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

数据结构学习记录-数据结构概念

1 数据结构&#xff1a; 数据结构是计算机存储&#xff0c;管理数据的方式。 数据必须依据某种逻辑联系组织在一起存储在计算机内 数据结构研究的就是这种数据的存储结构和数据的逻辑结构。 1.1 数据的逻辑结构&#xff1a; 逻辑结构指的是数据本身之间的关系 集合&#x…

zustand 切片模式使用,persist 中间件持久化状态

zustand - npm 安装 npm i zustand 创建切片目录&#xff1a; 创建切片 channelStore.js import { getChannelsAPI } from "/apis/article"; const channelStore (set) > {return {channelList: [],fetchChannelList: async () > {const res await getChanne…