RANSAC(随机抽样一致性算法)

RANSAC(随机抽样一致性算法)是一种用于估计数学模型参数的迭代方法,尤其适用于包含大量异常值的数据。使用 RANSAC,我们可以找到一个最优的线性拟合,同时最大限度地减少对异常值的影响。接下来,我将给出一个使用 RANSAC 进行线性回归的 Python 示例,并绘制散点、回归线及回归线的置信区间。

前置安装

首先,需要安装 scikit-learnmatplotlib 库,如果还没有安装,可以通过以下命令安装:

pip install scikit-learn matplotlib

代码示例

以下代码展示如何使用 RANSAC 进行线性回归:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import RANSACRegressor, LinearRegression
from sklearn.utils import resample

# 生成数据:带有异常值的线性数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, x.shape)

# 添加一些异常值
x[::10] = np.random.uniform(0, 10, size=(10,))
y[::10] = np.random.uniform(-10, 30, size=(10,))

# Reshape x for sklearn
x = x.reshape(-1, 1)

# 创建RANSAC模型
model = RANSACRegressor(estimator=LinearRegression(), random_state=42)
model.fit(x, y)

# 预测值
x_pred = np.linspace(0, 10, 100).reshape(-1, 1)
y_pred = model.predict(x_pred)

# 获取内点和外点
inlier_mask = model.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)

# 使用 Bootstrap 方法计算置信区间
n_bootstraps = 200
y_pred_bootstrap = []

for _ in range(n_bootstraps):
    # 随机采样数据集(仅内点)
    x_sample, y_sample = resample(x[inlier_mask], y[inlier_mask])
    ransac_bootstrap = RANSACRegressor(estimator=LinearRegression(), random_state=42)
    ransac_bootstrap.fit(x_sample, y_sample)
    
    # 预测
    y_pred_sample = ransac_bootstrap.predict(x_pred)
    y_pred_bootstrap.append(y_pred_sample)

# 转换为数组并计算 95% 置信区间
y_pred_bootstrap = np.array(y_pred_bootstrap)
lower_bound = np.percentile(y_pred_bootstrap, 2.5, axis=0)
upper_bound = np.percentile(y_pred_bootstrap, 97.5, axis=0)

# 绘制散点图、RANSAC回归线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x[inlier_mask], y[inlier_mask], color='blue', label='Inliers', alpha=0.6)
plt.scatter(x[outlier_mask], y[outlier_mask], color='red', label='Outliers', alpha=0.6)
plt.plot(x_pred, y_pred, color='green', label='RANSAC Linear Fit', linewidth=2)
plt.fill_between(x_pred.ravel(), lower_bound, upper_bound, color='lightgreen', alpha=0.5, label='95% Confidence Interval')
plt.xlabel('x')
plt.ylabel('y')
plt.title('RANSAC Linear Regression with Confidence Interval')
plt.legend()
plt.grid()
plt.show()

代码说明

  1. 数据生成

    • 使用 numpy 生成带有噪声的线性数据。
    • 随机插入一些异常值,以模拟实际情况中的离群点。
  2. 模型创建

    • 创建 RANSACRegressor 模型,并使用 LinearRegression 作为基本估计器。
    • 拟合模型以找到最佳的线性回归线。
  3. 内点和外点

    • 使用 inlier_mask 获取模型中的内点(符合模型的点)和外点(异常点)。
  4. 置信区间计算

    • 使用 Bootstrap 方法从内点中随机采样 200 次,每次拟合 RANSAC 模型并预测。
    • 计算 95% 的置信区间。
  5. 绘图

    • 绘制散点图,分别标记内点和外点。
    • 绘制 RANSAC 拟合的回归线和 95% 置信区间。

输出图形

在这里插入图片描述

运行代码后会得到以下输出:

  • 蓝色点:代表符合模型的内点。
  • 红色点:代表被识别为异常值的外点。
  • 绿色线:代表 RANSAC 模型的线性回归拟合线。
  • 淡绿色区域:代表回归线的 95% 置信区间。

这个示例展示了 RANSAC 如何有效地处理异常值,同时仍然能够提供稳定的线性回归模型。

如果是曲线

min_samples 用于指定在拟合时最少需要多少个样本点(可以是样本数的比例或绝对数)。

在我们的情况下,因为我们使用的是二次多项式的线性回归模型,所以我们可以简单地设置 min_samples 为 2(因为二次多项式需要至少 3 个点来进行拟合)。

下面是修正后的代码:

修正后的代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import RANSACRegressor, LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.utils import resample

# 生成数据:带有异常值的二次曲线数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = 0.5 * (x ** 2) - x + 2 + np.random.normal(0, 2, x.shape)

# 添加一些异常值
x[::10] = np.random.uniform(0, 10, size=(10,))
y[::10] = np.random.uniform(-10, 30, size=(10,))

# Reshape x for sklearn
x = x.reshape(-1, 1)

# 创建二次多项式回归的 RANSAC 模型
degree = 2
model = RANSACRegressor(
    estimator=make_pipeline(PolynomialFeatures(degree), LinearRegression()),
    min_samples=2,  # 设置最少样本数
    random_state=42
)
model.fit(x, y)

# 预测值
x_pred = np.linspace(0, 10, 100).reshape(-1, 1)
y_pred = model.predict(x_pred)

# 获取内点和外点
inlier_mask = model.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)

# 使用 Bootstrap 方法计算置信区间
n_bootstraps = 200
y_pred_bootstrap = []

for _ in range(n_bootstraps):
    # 随机采样数据集(仅内点)
    x_sample, y_sample = resample(x[inlier_mask], y[inlier_mask])
    model_bootstrap = RANSACRegressor(
        estimator=make_pipeline(PolynomialFeatures(degree), LinearRegression()),
        min_samples=2,  # 设置最少样本数
        random_state=42
    )
    model_bootstrap.fit(x_sample, y_sample)
    
    # 预测
    y_pred_sample = model_bootstrap.predict(x_pred)
    y_pred_bootstrap.append(y_pred_sample)

# 转换为数组并计算 95% 置信区间
y_pred_bootstrap = np.array(y_pred_bootstrap)
lower_bound = np.percentile(y_pred_bootstrap, 2.5, axis=0)
upper_bound = np.percentile(y_pred_bootstrap, 97.5, axis=0)

# 绘制散点图、RANSAC回归二次曲线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x[inlier_mask], y[inlier_mask], color='blue', label='Inliers', alpha=0.6)
plt.scatter(x[outlier_mask], y[outlier_mask], color='red', label='Outliers', alpha=0.6)
plt.plot(x_pred, y_pred, color='green', label='RANSAC Quadratic Fit', linewidth=2)
plt.fill_between(x_pred.ravel(), lower_bound, upper_bound, color='lightgreen', alpha=0.5, label='95% Confidence Interval')
plt.xlabel('x')
plt.ylabel('y')
plt.title('RANSAC Quadratic Regression with Confidence Interval')
plt.legend()
plt.grid()
plt.show()

代码修改说明

在这里插入图片描述

  1. 添加 min_samples 参数:在创建 RANSACRegressor 实例时,明确指定 min_samples=2,这是因为拟合一个二次多项式需要至少 3 个样本点来确定二次方程的系数。

  2. 其余部分保持不变:保留了数据生成、模型拟合、置信区间计算和绘图的其余部分。

运行此修正后的代码,应该能够顺利生成 RANSAC 二次曲线拟合的散点图和置信区间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群控系统服务端开发模式-应用开发-业务架构逻辑开发第一轮测试

整个系统的第一个层次已经开发完毕,已经有简单的中控,登录、退出、延迟登录时长、黑名单、数据层封装、验证层封装、RSA加解密、Redis等功能,还缺获取个人、角色按钮权限、角色菜单权限功能。角色按钮权限以及角色菜单权限等明后天开发&#…

react基础之reactHooks

文章目录 React Hooks 使用指南常用 Hooks使用规则 小结 React Hooks 使用指南 React Hooks 是 React 16.8 引入的一种新特性,允许在函数组件中使用状态和其他 React 特性,而无需编写类组件。以下是一些基础的 Hooks 及其使用规则。 常用 Hooks useSta…

桑基图在医学数据分析中的更复杂应用示例

桑基图(Sankey Diagram)能够有效地展示复杂的流动关系,特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来,我们将构建一个稍微复杂的示例,展示不同疾病患者在治疗过程中的流动,以及他们的治…

Android15音频进阶之Cuttlefish搭建音频开发环境(九十二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

koa + sequelize做距离计算(MySql篇)

1.核心思路 1.利用sequelize的fn方法调用MySql原生函数(ST_Distance_Sphere 、POINT) 2.通MOD过函数将查询到的距离除以1000,这样km就变成了米 ,利用FOMAT函数将查询到的结果精确到两位小数 3.这里利用到了MySql的原生函数&…

【Oracle APEX开发小技巧10】CSS样式控制交互式报表列宽和自动换行效果

在实际开发中使用交互式报表可能会出现某些字段的列宽过长,某些字段的列宽只有缩到一角的情况,那么如何解决这种情况呢?有没有方法可以控制交互式报表的列宽呢?下面就来介绍一下解决方法: 页设置-页-CSS-内嵌 输入如下…

IO详解(BIO、NIO、实战案例、底层原理刨析)

文章目录 IO详解(BIO、NIO、实战案例、底层原理刨析)🌎 IO🪐 同步、异步、阻塞、非阻塞⚡ BIO👽 简介😎 案例 🚀 NIO✈️ 介绍🚗 Buffer(缓冲)🛸 …

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan之搜索语法进阶

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Python复习1:

一、数据类型 1.数字:int、float、bool 2.字符串:string 3.列表:list 4.集合:set 5.字典:dictionary 二、Test 1.print输出固定格式 num110 str1"hello world" #输出的固定格式 print("num1%d&…

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装,它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的,而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装,具体实现代码如下: …

Python爬虫抓取三个网站上的英语每日一句

一、引言 大学英语学习需要巩固高中语法,补充四六级词汇,增加英语语感,提升英语的运用能力。学好英语有很多种方法,采用句子来突破英语语法、词汇、口语和听力的方法简单有效,值得提倡。李阳就是采用这种方法来教授英…

三相LCL并网逆变器—为什么采用LCL滤波器

1.为什么需要滤波器 当前并网逆变器大多采用脉冲宽度调制(PWM)技术,导致桥臂输出的电压中存在开关频率及倍数频率次的谐波电压,进而使得输出到电网的电流中含有谐波。从电网的角度来看,是不希望系统内含有高次谐波的,因为这会影响…

【STM32】按键控制LED 光敏传感器控制蜂鸣器

文章目录 前置知识按键介绍传感器模块硬件电路按键硬件电路传感器模块硬件电路 C语言数据类型在Keil中的对应写法C语言枚举 按键控制LED接线图Hardware文件夹(模块化编程)LED驱动程序封装Key(按键)驱动程序封装 main.c源文件 光敏传感器控制蜂鸣器接线图…

飞书API-获取tenant_access_token

1.在飞书工作台创建应用,跳到开发者后台,选创建企业自建应用 2.设置并发布应用 必须要发布应用才可以开始使用了!!! 3.调用获取token的API 参考链接: 开发文档 - 飞书开放平台https://open.feishu.cn/do…

SpringBoot篇(自动装配原理)

目录 一、自动装配机制 1. 简介 2. 自动装配主要依靠三个核心的关键技术 3. run()方法加载启动类 4. 注解SpringBootApplication包含了多个注解 4.1 SpringBootConfiguration 4.2 ComponentScan 4.3 EnableAutoConfiguration 5. SpringBootApplication一共做了三件事 …

Rust 力扣 - 48. 旋转图像

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以将原矩阵进行水平翻转&#xff0c;然后在沿主对角线进行翻转&#xff0c;就能完成原矩阵沿顺时针方向旋转90o的变换 题解代码 impl Solution {pub fn rotate(matrix: &mut Vec<Vec<i32>&…

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发

使用 PyCharm 构建 FastAPI 项目&#xff1a;零基础入门 Web API 开发 本文提供了一份完整的 FastAPI 入门指南&#xff0c;涵盖从环境搭建、依赖安装到创建并运行一个简单的 FastAPI 应用的各个步骤。通过 FastAPI 和 Uvicorn&#xff0c;开发者可以快速构建现代化的 Web API…

练习LabVIEW第三十五题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十五题&#xff1a; 使用labview模拟一个3-8译码器 开始编写&#xff1a; 用LabVIEW做3-8译码器首先要知道它是个啥…

【流量控制】之创建和管理前缀列表

前缀列表是包含一个或多个CIDR地址块的集合。您可以自主创建前缀列表并对其进行管理。在创建过程中&#xff0c;您可以将现有的前缀列表克隆&#xff08;复制&#xff09;到指定地域&#xff08;同地域或跨地域&#xff09;&#xff0c;让操作更加便捷。本文介绍如何使用专有网…