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

news2024/9/27 23:27:18

        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和b
    iters = 10000  # 迭代次数
    epsilon = 3  # 内点的误差阈值
    threshold = (SIZE - OUT) / SIZE + 0.01  # 阈值,用于控制早停(early stopping)策略
    best_a, best_b = 0, 0  # 最佳线性回归模型的参数,初始值为0
    pre_total = 0  # 内点数量的初始值,初始为0

    # 进行迭代操作,寻找最佳的线性回归模型参数a和b
    for 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和截距b
        a = (y_2 - y_1) / (x_2 - x_1)  # 计算斜率a
        b = y_1 - a * x_1  # 计算截距b
        total_in = 0  # 内点计数器,初始值为0

        # 对于每一个数据点,计算其对应的预测值,并与真实值进行比较,如果误差小于epsilon,则认为此点为内点,计数器加1
        for index in range(SIZE):
            y_estimate = a * list_x[index] + b  # 根据线性回归模型计算出预测值
            if abs(y_estimate - list_y[index]) < epsilon:  # 判断预测值与真实值的误差是否小于epsilon
                total_in += 1  # 如果小于epsilon,则此点为内点,计数器加1

        # 如果当前的内点数量大于之前所有的内点数量,则更新最佳参数a和b,以及内点数量pre_total
        if total_in > pre_total:  # 记录最大内点数与对应的参数
            pre_total = total_in
            best_a = a
            best_b = b

        # 如果当前的内点数量大于设定的阈值所对应的人数,则跳出循环,不再进行迭代
        if total_in > SIZE * threshold:  # 如果当前内点数量大于阈值所设定的人数,则跳出循环
            break  # 跳出循环
    print("迭代{}次,a = {}, b = {}".format(i, best_a, best_b))  # 输出当前迭代的次数,以及对应的线性回归模型参数a和b
    x_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.coloradmin.cn/o/1334223.html

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

相关文章

Java 的 8 种异步实现方式

一、前言 异步执行对于开发者来说并不陌生&#xff0c;在实际的开发过程中&#xff0c;很多场景多会使用到异步&#xff0c;相比同步执行&#xff0c;异步可以大大缩短请求链路耗时时间&#xff0c;比如&#xff1a;「发送短信、邮件、异步更新等」 &#xff0c;这些都是典型的…

将ipynb文件转为py的简单方法(图文并茂)

打开可以使用jupyter命令的命令窗口&#xff08;如果没有jupyter则需要先安装jupyter&#xff09;&#xff0c;cd 命令进入到 ipynb 文件所在的文件夹&#xff0c;执行 jupyter nbconvert --to script xxx.ipynb 即可完成 ipynb 文件到 py 文件的转化&#xff0c;执行 jupyter …

每秒生成110张图像!StreamDiffusion开源 实时图像生成更强了

StreamDiffusion是一个开源项目&#xff0c;最近在推特上引起了热烈讨论。这个项目基于LCM和SDXL Turbo技术&#xff0c;每秒能够生成110张图像&#xff0c;为想要开发实时图像生成产品的人提供了一个值得关注的资源。这个项目主要是为了实时图像生成服务而设计的&#xff0c;并…

基于java的汽车维修保养智能预约系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

探索 HTTP 请求的世界:get 和 post 的奥秘(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

kubevela 安装(windows、minikube)

minikube 启动指定版本的 k8s minikube start --kubernetes-versionv1.23.4 根据 kubevela 的 官网 提示&#xff0c;执行 powershell -Command "iwr -useb https://kubevela.net/script/install.ps1 | iex" 出现如下问题&#xff0c;根据提示执行 Set-ExecutionPo…

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch等各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;…

移动开发git版本控制经验之谈

移动开发git版本控制经验之谈 团队或应用规模是否会影响发布流程&#xff1f;这取决于具体情况。让我们来想象一下一个小型团队的创业公司。在这种情况下&#xff0c;通常是团队开发一个功能&#xff0c;然后直接发布。现在我们再来想象一个大型项目&#xff0c;比如一个银行应…

Linux之基础I/O

目录 一、C语言中的文件操作 二、系统文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、对fd的理解 3、文件描述符的分配规则 四、重定向 1、重定向的原理 2、重定向的系统调用dup2 五、Linux下一切皆文件 一、C语言中的文件操作 1、打开和关闭 在C语言的文…

Redis的安装以及使用

第一步&#xff0c;去官网下载一个压缩包到本地解压即用&#xff0c;绿色软件&#xff0c;不用其他操作&#xff0c;点击Download下载即可&#xff1a; Introduction to Redis | RedisLearn about the Redis open source projecthttps://redis.io/docs/about/第二步&#xff0…

电脑开机快捷启动,启动菜单没有u盘怎么办

电脑开机快捷启动键找不到u盘怎么办 对于快捷启动键找不到u盘的问题&#xff0c;小编很了解其中的门道&#xff0c;因为开机找不到u盘是我们使用电脑时候的常见问题。那么我们到底要如何解决开机找不到u盘的问题呢?其实方法还是蛮简单的&#xff0c;下面小编就来教大家电脑开…

STM32启动解析

启动方式对的不同下载模式 STM32可以通过BOOT引脚的配置&#xff0c;来选择不同的启动模式------对应不同的下载方式。 仿真器下载—— 内部FLASH的启动方式 串口下载 —— 系统存储器的启动方式 内部SRAM一般不用&#xff0c;不讲 启动过程 以内部FLASH的启动方式为例&am…

运维工程师都要干些啥?

随着互联网的高速发展&#xff0c;虽然从前的“双微一抖”已经过时了&#xff0c;现在流行“小手微抖博B乎”。各类APP及网站规模越来越大&#xff0c;架构也变得越来越复杂。对于运维工程师的挑战也越来越高。 运维工程师在软件产品的整个生命周期中扮演着重要的角色&#xf…

Java多线程技术五——单例模式与多线程

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中&#xff0c;我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明&#xff0c;线程与某些技术相结合中&#xff0c;我们要考虑的事情会…

公司电脑文件透明加密保护,防泄密系统——防止核心文件、文档、设计图纸、源代码、音视频等数据资料外泄!

天锐绿盾透明加密防泄密系统是一种强大的数据保护方案&#xff0c;它采用先进的透明加密技术&#xff0c;能够在不影响员工工作习惯的前提下&#xff0c;对公司的所有电子文件进行自动、即时的加密处理。这种系统对于保护企业的核心数据资产至关重要。 PC访问地址&#xff1a;w…

plsql连接报ORA-12537

客户新电脑装上了plsql&#xff0c;连接数据库时报如上错误&#xff0c;但是别的电脑都可以正常连接&#xff0c;先检查了下TNS配置&#xff0c;发现没问题&#xff0c;数据库连接数也足够&#xff0c;百思不得其解 后面去数据库服务器上查看了监听日志文件&#xff0c;连接报错…

elasticsearch-py 8.x的一些优势

​ 早在 2022 年 2 月,当 Elasticsearch 8.0 发布时,Python 客户端也发布了 8.0 版本。它是对 7.x 客户端的部分重写,并带有许多不错的功能(如下所述),但也带有弃用警告和重大更改。今天,客户端的 7.17 版本仍然相对流行,每月下载量超过 100 万次,占 8.x 下载量的 ~50…

JVM初识-----01章

一.虚拟机与java虚拟机的区别以及共同点 1.虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09; 是一种能够在物理计算机上模拟一台完整的计算机系统的软件。它运行在宿主操作系统之上&#xff0c;可以提供一个独立的运行环境&#xff0c;使得在不同的操作系统上…

事实验证文章分类 Papers Category For Fact Checking

事实验证文章分类 Papers Category For Fact Checking By 2023.11 个人根据自己的观点&#xff0c;花了很多时间整理的一些关于事实验证领域证据召回&#xff0c;验证推理过程的文献综合整理分类&#xff08;不是很严谨&#xff09;。 引用请注明出处 欢迎从事事实验证Fact…

「Vue3面试系列」Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

文章目录 一、Object.defineProperty为什么能实现响应式 小结 二、proxy三、总结参考文献 一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么…