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

RANSAC算法

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


核心思想

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

  1. 随机采样 :

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

  2. 模型拟合 :

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

  3. 一致性验证 :

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

  4. 评估模型 :

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

  5. 重复迭代 :

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


优缺点

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

RANSAC算法的伪代码

Matlab 复制代码
输入:数据集、模型类型、最大迭代次数、误差阈值
输出:最佳模型参数

1. 初始化:
   - best_model ← None
   - max_inliers ← 0

2. 循环 max_iterations 次:
   a. 从数据集中随机选择子集 sample_points
   b. 使用 sample_points 拟合模型 model
   c. 计算所有点到 model 的误差
   d. 识别误差小于 threshold 的内点集合 inliers
   e. 如果 inliers 的数量大于 max_inliers:
      - 更新 max_inliers ← inliers 的数量
      - 更新 best_model ← 当前 model

3. 返回 best_model

Python实现:RANSAC用于直线拟合

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

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import RANSACRegressor
from sklearn.datasets import make_regression

plt.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. 内点与外点统计:

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

RANSAC的应用领域

  1. 计算机视觉 :
    • 估计图像特征之间的变换(如单应性矩阵、基本矩阵)。
  2. 机器人导航 :
    • 激光雷达点云拟合平面或直线。
  3. 信号处理与工程 :
    • 对噪声信号中的模型参数估计。
  4. 统计学与机器学习 :
    • 构建鲁棒模型,减少异常数据对结果的影响。
相关推荐
成为深度学习高手9 分钟前
SEMixer:以随机注意力增强patch语义、渐进混合多尺度的轻量长期时序预测模型
人工智能·深度学习·机器学习·数据挖掘·时间序列
All for pursuit.26 分钟前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青27 分钟前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq28 分钟前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq30 分钟前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
李游Leo1 小时前
HarmonyOS 7 InsightBoard 多形态适配实录 06:ArkUI × 多设备回归:布局抖动、监听释放与全形态验收【鸿蒙心迹】
回归·kotlin·harmonyos
阡陌数智1 小时前
大模型领域自适应微调:小样本场景下过拟合抑制与数据构建方法论
人工智能·深度学习·机器学习
Godspeed Zhao2 小时前
现代智能雷达技术19——算法(5)
算法