【Mathematical Model】Ransac线性回归Python代码

        Ransac算法,也称为随机抽样一致性算法,是一种迭代方法,用于从一组包含噪声或异常值的数据中估计数学模型。Ransac算法特别适用于线性回归问题,因为它能够处理包含异常值的数据集,并能够估计出最佳的线性模型。

1 简介

        在数据分析和机器学习的领域中,线性回归是一种广泛使用的预测模型。然而,当数据集中包含异常值或噪声时,传统的线性回归方法可能会受到严重影响。为了解决这一问题,Ransac线性回归算法提供了一种稳健的方法来估计线性模型参数。

        Ransac算法的核心思想是从数据集中随机选择一个子集作为基础样本,并使用这个子集估计线性模型的参数。然后,它会计算所有数据点到这个模型的误差,并根据一个预设的阈值来判断该模型是否可以接受。如果模型被接受,Ransac算法会继续优化模型参数;否则,它会选择另一个子集并重复这个过程。

在Ransac线性回归中,算法的基本步骤如下:

  1. 随机选择数据集中的子集作为模型的基础样本。基础样本的大小通常由用户设定,通常为数据集大小的一定比例。
  2. 使用基础样本估计线性模型的参数,如斜率和截距。
  3. 计算模型误差,即数据集中每个点与模型预测值之间的距离。
  4. 判断是否满足停止准则,即是否找到了一个足够好的模型。如果满足,则退出算法;否则,继续迭代。
  5. 在数据集中选择与当前模型最不一致的点作为异常值,将其从数据集中移除。
  6. 重复步骤1-5,直到找到一个足够好的模型或者达到最大迭代次数。

        Ransac算法的优点在于它能够处理包含异常值的数据集,并能够估计出最佳的线性模型。它的缺点是迭代次数可能较多,计算复杂度较高。另外,Ransac算法对于数据的分布假设敏感,如果数据分布不符合假设,可能会导致算法性能下降。    

2 Python代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/10/17 14:13
@Auth : RS迷途小书童
@File :Ransac线性回归.py
@IDE :PyCharm
"""
import numpy as np  # 导入numpy库,用于进行数值计算和处理数组
import matplotlib.pyplot as plt  # 导入matplotlib库的pyplot模块,用于绘制图形
import random  # 导入random库,用于生成随机数# 定义生成数据集的参数
SIZE = 500  # 数据点的总数
OUT = 230  # 数据的上限
X = np.linspace(0, 100, SIZE)  # 生成从0到100,共SIZE个数据点的等差数列Y = []  # 创建一个空列表,用于存储所有的数据值# 对于X中的每一个元素,执行以下操作
for i in X:# 生成一个0到10之间的随机整数,如果这个数大于5,执行下面的if语句,否则执行else语句if random.randint(0, 10) > 5:# 从0到OUT之间随机生成一个整数,并添加到Y列表中Y.append(random.randint(0, OUT))else:# 再次生成一个0到10之间的随机整数,如果这个数大于5,执行下面的if语句,否则执行else语句if random.randint(0, 10) > 5:# 根据当前元素i和随机生成的数值计算出一个新的y值,并添加到Y列表中Y.append(3 * i + 10 + 3 * random.random())else:Y.append(3 * i + 10 - 3 * random.random())  # 同上,只是计算公式略有不同list_x = np.array(X)  # 将X转换为numpy数组,方便后续的数据处理和计算
list_y = np.array(Y)  # 将Y转换为numpy数组,方便后续的数据处理和计算# 使用matplotlib库绘制原始数据点的散点图
plt.scatter(list_x, list_y)  # 在二维平面上绘制原始数据点,使用散点图展示
plt.show()  # 显示绘制的图形def linear_regression(list_x, list_y):# 进行迭代操作,寻找最佳的线性回归模型参数a和biters = 10000  # 迭代次数epsilon = 3  # 内点的误差阈值threshold = (SIZE - OUT) / SIZE + 0.01  # 阈值,用于控制早停(early stopping)策略best_a, best_b = 0, 0  # 最佳线性回归模型的参数,初始值为0pre_total = 0  # 内点数量的初始值,初始为0# 进行迭代操作,寻找最佳的线性回归模型参数a和bfor i in range(iters):# 从SIZE个数据点中随机选择两个点,索引存储在sample_index中sample_index = random.sample(range(SIZE), 2)x_1 = list_x[sample_index[0]]  # 获取第一个点的x值x_2 = list_x[sample_index[1]]  # 获取第二个点的x值y_1 = list_y[sample_index[0]]  # 获取第一个点的y值y_2 = list_y[sample_index[1]]  # 获取第二个点的y值# 根据两个点的坐标计算出线性回归模型的斜率a和截距ba = (y_2 - y_1) / (x_2 - x_1)  # 计算斜率ab = y_1 - a * x_1  # 计算截距btotal_in = 0  # 内点计数器,初始值为0# 对于每一个数据点,计算其对应的预测值,并与真实值进行比较,如果误差小于epsilon,则认为此点为内点,计数器加1for index in range(SIZE):y_estimate = a * list_x[index] + b  # 根据线性回归模型计算出预测值if abs(y_estimate - list_y[index]) < epsilon:  # 判断预测值与真实值的误差是否小于epsilontotal_in += 1  # 如果小于epsilon,则此点为内点,计数器加1# 如果当前的内点数量大于之前所有的内点数量,则更新最佳参数a和b,以及内点数量pre_totalif total_in > pre_total:  # 记录最大内点数与对应的参数pre_total = total_inbest_a = abest_b = b# 如果当前的内点数量大于设定的阈值所对应的人数,则跳出循环,不再进行迭代if total_in > SIZE * threshold:  # 如果当前内点数量大于阈值所设定的人数,则跳出循环break  # 跳出循环print("迭代{}次,a = {}, b = {}".format(i, best_a, best_b))  # 输出当前迭代的次数,以及对应的线性回归模型参数a和bx_line = list_x  # 获取x轴的数据y_line = best_a * x_line + best_b  # 根据最佳线性回归模型计算出y轴的数据plt.plot(x_line, y_line, c='r')  # 使用matplotlib库绘制出线性回归模型的直线图,并用红色表示plt.scatter(list_x, list_y)  # 使用matplotlib库绘制出原始数据的散点图,并用其他颜色表示plt.show()  # 显示绘制的图形linear_regression(list_x, list_y)

3 总结

        Ransac线性回归是一种强大的线性回归方法,尤其适用于处理包含异常值和噪声的数据集。通过随机抽样一致性原则,Ransac算法能够从数据中筛选出可靠的基础样本,并基于此估计线性模型的参数。与传统的线性回归相比,Ransac算法具有更好的鲁棒性、灵活性、计算效率和可解释性。在实际应用中,Ransac线性回归已被广泛应用于各种领域,如回归预测、特征选择和异常检测等。通过与其他技术和方法的结合,Ransac线性回归还有望在未来进一步扩展其应用范围和性能。总之,Ransac线性回归是一种值得深入研究和应用的线性回归方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常解析————Parameter metadata not available for the given statement

引言 在将数据存入mysql数据库时抛出异常&#xff1a;Parameter metadata not available for the given statement。参数元数据对于给定的声明不可用。 SQL本身并没有错误&#xff1a; Autowiredprivate JdbcTemplate jdbc;public Integer saveScenicSequence(ScenicSequence…

Swagger使用————接口参数注解的使用缺陷

问题描述 在使用springboot开发web项目时&#xff0c;用到了swagger框架&#xff0c;来生成web api文档。但是其中有一项是举例说明参数的结构&#xff0c;如下图&#xff1a;但是&#xff0c;这个功能真的是非常方便&#xff0c;因为可以让前端开发人员第一时间得知参数的内部…

分布式事务最终一致性常用方案

分布式事务最终一致性常用方案目前的应用系统&#xff0c;不管是企业级应用还是互联网应用&#xff0c;最终数据的一致性是每个应用系统都要面临的问题&#xff0c;随着分布式的逐渐普及&#xff0c;数据一致性更加艰难&#xff0c;但是也很难有银弹的解决方案&#xff0c;也并…

数据列表的分页实现————分页敏捷开发

概要 分页功能是比较常见的基础功能&#xff0c;虽然比较简单&#xff0c;但是每次需要用到这个功能的时候还是需要现写一遍。为了实现更加宏观的业务复用&#xff0c;特将本人特别喜欢的简易分页逻辑在此记述&#xff0c;以备日后重用。 逻辑描述 一般的分页实现方式多是通…

Eclipse深度患者设置VSCode快捷键

VSCode设置Eclipse中常用的快捷键 将eclipse中一些基本的快捷键输入右侧用户快捷键设置中&#xff1a; // Place your key bindings in this file to overwrite the defaults [{ "key": "alt/", "command": "editor.action.triggerSugges…

NodeJS学习————关于let和const命令的使用理解

let的基本用法 在新的js规范ES6中&#xff0c;新增了let 命令&#xff0c;用来声明变量。用法类似于var&#xff0c;但不同的是所声明的变量&#xff0c;只在let 命令所在的代码块内有效。 { let a 10; var b 10; } //ReferenceError: a is not defined console.log(a …

forward和redirect的区别是什么?

forward和redirect是什么&#xff1f; 是servlet种的两种主要的跳转方式。forward又叫转发&#xff0c;redirect叫做重定向。 区别&#xff1a;&#xff08;本地效应次数&#xff09; 地址栏&#xff0c;数据共享&#xff0c;应用场景&#xff0c;效率&#xff0c;本质&…

MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

一、MySQL索引类型 MySql常见索引类型有&#xff1a;主键索引、唯一索引、普通索引、全文索引、组合索引 PRIMARY KEY&#xff08;主键索引&#xff09; ALTER TABLE table_name ADD PRIMARY KEY ( column ) UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (colu…

Servlet入门总结

一、了解Servlet的概念Servlet定义&#xff1a;Servlet是基于Java技术的Web组件&#xff0c;由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。 注意&#xff1a;Servlet不是从…

MySQL日期类型的处理总结

一、概述 MySQL中的日期类型包括以下5种&#xff1a; 类型大小 (字节)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3-838:59:59/838:59:59HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:…

详解HTTP协议~~~

详解HTTP协议~~~HTTP 简介HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;…

Mybatis Plus————代码生成器

代码生成器 MyBatis Plus是MyBatis的扩展框架&#xff0c;而代码生成器是MP的核心功能之一&#xff0c;另外还有 “条件构造器”和“通用CRUD”等功能。 步骤演示 mp的代码生成器有两种方式自动生成代码&#xff0c;一种是通过main方法来执行程序&#xff0c;另一种是通过maven…

Spring MVC 流程图解析

Spring MVC 流程图解析Spring MVC工作流程图图一图二 SpringMVC工作流程描述DispatcherServlet&#xff0c;HandlerMapping&#xff0c;HandlerExecutionChain&#xff0c;HandlerAdapter&#xff0c;HttpMessageConveter&#xff0c;BindingResult&#xff0c;ModelAndView&am…

Java并发编程实战————可重入内置锁

引言 在《Java Concurrency in Practice》的加锁机制一节中作者提到&#xff1a; Java提供一种内置的锁机制来支持原子性&#xff1a;同步代码块。“重入”意味着获取锁的操作的粒度是“线程”&#xff0c;而不是调用。当某个线程请求一个由其他线程持有的锁时&#xff0c;发出…

java的守护进程与非守护进程

java的守护进程与非守护进程 最近重新研究Java基础知识&#xff0c;发现以前太多知识知识略略带过了&#xff0c;比较说Java的线程机制&#xff0c;在Java中有两类线程&#xff1a; User Thread(用户线程)、Daemon Thread(守护线程) &#xff0c;&#xff08;PS:以前忽略了&a…

双剑合璧————Spring Boot + Mybatis Plus

引言 最近在学习Mybatis Plus的使用&#xff0c;希望通过spring boot快速将mybatis plus整合进来。 对于springboot项目&#xff0c;mybatis plus团队也有自己的启动器 &#xff1a;mybatis-plus-boot-starter。这个依赖内部已经整合了mybatis-spring&#xff0c;也包括非快速…

Git初学札记(一)————Git简介与安装

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。&#xff08;在这里再一次致敬Linus大神&#xff09;特点 分布式相比于集中式的最…

Git初学札记(二)————EGit导入远程Git仓库项目(Clone操作)

引言 我们在实际开发项目的时候&#xff0c;难免要使用像Eclipse或者IDEA这样的继承开发工具&#xff0c;除了部分“牙牙学语”的程序员需要手动输入javac去编译程序以外&#xff0c;在实际开发中手动编译并运行项目的“猿族”应该是已经绝种了。 我个人认为&#xff0c;使用gi…

Git初学札记(三)————创建Git版本库

引言 版本库即所谓的Git仓库&#xff0c;英文名称是Repository&#xff0c;可以简单理解为一个目录&#xff08;.git folder&#xff09;&#xff0c;这个目录可以记录并保存直接父级及其子目录下的全部文本文件的修改操作&#xff0c;谓之“版本控制”&#xff01; 手动建库 不…

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

目录 引言 Git命令行的远程Push EGit Push操作中的冲突问题 同步 工作区与本地库同步 工作区与远程库同步 图标 重点 引言 在团队开发当中&#xff0c;Git Push是多人协作环节中的最重要的一环可能没有之一。同SVN一样&#xff0c;push操作可以看做是对远端程序的提交…