【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和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线性回归是一种值得深入研究和应用的线性回归方法。

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

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

相关文章

RT-Smart 官方 ARM 32 平台 musl gcc 工具链下载

前言 RT-Smart 的开发离不开 musl gcc 工具链&#xff0c;用于编译 RT-Smart 内核与用户态应用程序 RT-Smart musl gcc 工具链代码当前未开源&#xff0c;但可以下载到 RT-Thread 官方编译好的最新的 musl gcc 工具链 ARM 32位 平台 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

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

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

推荐五个免费的网络安全工具

导读&#xff1a; 在一个完美的世界里&#xff0c;信息安全从业人员有无限的安全预算去做排除故障和修复安全漏洞的工作。但是&#xff0c;正如你将要学到的那样&#xff0c;你不需要无限的预算取得到高质量的产品。这里有SearchSecurity.com网站专家Michael Cobb推荐的五个免费…

LSTM(长短期记忆网络)的设计灵感和数学表达式

1、设计灵感 LSTM&#xff08;长短期记忆网络&#xff09;的设计灵感来源于传统的人工神经网络在处理序列数据时存在的问题&#xff0c;特别是梯度消失和梯度爆炸的问题。 在传统的RNN&#xff08;循环神经网络&#xff09;中&#xff0c;信息在网络中的传递是通过隐状态向量进…

Vue编写登录注册页面前端校验

登录注册校验 template页面 <div class"app-login"><!--登录 --><div class"form"><el-form ref"form" size"large" autocomplete"off" v-if"isLogin" :model"registerData" :r…

网络监测之如何保障企业业务系统安全?

网络信息安全在网络时代的重要性不言而喻。随着互联网的普及和数字化进程的加速&#xff0c;网络已经成为人们生活、工作和学习的重要平台。在这个平台上&#xff0c;信息交流、数据存储、在线支付等都需要依赖于网络信息安全。其中企事业单位业务系统安全值得关注。 企事业单…

Linux文件系统与命令行

什么是命令行? 接收键盘命令并将其传给操作系统执行的程序(用于输入和管理命令的程序),统称命令行,也叫: Shell&#xff0c;几乎所有Linux发行版都提供了一个 Shell 程序,叫做: Bash (Bourne-Again Shell, 因为最初的 Shell 是由 Steve Bourne 编写的原始 Unix 程序, Again 表…

关于调试和开发中对文件写操作导致乱码问题

背景基于上文log机制重定向问题&#xff0c;将代码打印单独存放文件中出现双击文件&#xff0c;如下图现象所示(银河麒麟系统) 使用vim打开文件发现有许多/00的乱码。 怀疑是数据没有同步至硬盘导致的。 于是在每次输入到文件后加入fdatasync函数&#xff0c;部分代码如下&am…

TikTok与环保:短视频如何引领可持续生活方式?

在数字时代&#xff0c;社交媒体平台扮演着塑造文化和价值观的关键角色。而TikTok&#xff0c;作为一款全球短视频平台&#xff0c;不仅塑造着用户的娱乐方式&#xff0c;还在悄然地引领着可持续生活方式的潮流。本文将深入探讨TikTok与环保之间的关系&#xff0c;分析短视频如…

11-Kafka

1 Kafka Kafka是一个分布式流式数据平台&#xff0c;它具有三个关键特性 Message System: Pub-Sub消息系统Availability & Reliability&#xff1a;以容错及持久化的方式存储数据记录流Scalable & Real time 1.1 Kafka架构体系 Kafka系统中存在5个关键组件 Producer…

路由器介绍和命令操作

先来回顾一下上次的内容&#xff1a; ip地址就是由32位二进制数组 二进位数就是只有数字0和1组成 网络位&#xff1a;类似于区号&#xff0c;表示区域作用 主机位&#xff1a;类似于号码&#xff0c;表示区域中编号 网络名称&#xff1a;网络位不变&#xff0c;主机位全为0 …

基于Java SSM框架实现二手交易平台网站系统项目【项目源码+论文说明】

基于java的SSM框架实现二手交易平台网站系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

易基因2023年度DNA甲基化研究项目文章精选

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2023年&#xff0c;易基因参与的DNA甲基化研究成果层出不穷&#xff0c;小编选取其中5篇不同方向的论文与您一起来回顾。 01、易基因微量DNA甲基化测序助力中国科学家成功构建胚胎干细胞…

IDEA中Git的常用使用方式

IDEA中Git的常用使用方式 1.初次拉取远程仓库项目代码到本地2.初次提交本地项目代码到远程仓库新分支方式一&#xff1a;提交时把.git目录删除掉&#xff0c;不保留以往修改记录方式二&#xff1a;提交时不删除.git目录&#xff0c;保留以往修改记录 3.日常拉取、提交、推送代码…

如何清洗眼镜?清洗眼镜方法有哪些?好用超声波洗眼镜机推荐

随着现代人对于眼睛健康越来越重视&#xff0c;清洗眼镜成为了日常生活中不可或缺的一环。眼镜上的污渍和细菌不仅会影响视线&#xff0c;还可能对眼睛健康造成威胁。那么&#xff0c;如何清洗眼镜呢&#xff1f;清洗眼镜的方法有哪些呢&#xff1f;今天&#xff0c;我们将为大…

第二证券:A股“磨底”中等待向上突破

A股“磨底”中等候向上打破。从A股两市成交额、首要指数估值和风险溢价看&#xff0c;当时A股处于中长时刻底部区间&#xff0c;投资者倾向于将中长时刻问题在短期定价&#xff0c;市场风险偏好还有待修正。工作装备上&#xff0c;年底板块轮动加速将成为首要特征&#xff0c;大…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

JVM初识-----01章

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

Node.js(二)-模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

1224. 交换瓶子(蓝桥杯/图论)

题目&#xff1a; 1224. 交换瓶子 - AcWing题库 输入样例1&#xff1a; 5 3 1 2 5 4输出样例1&#xff1a; 3输入样例2&#xff1a; 5 5 4 3 2 1输出样例2&#xff1a; 2 思路&#xff1a;图论 1.将对应的位置与当前的瓶子序列相连形成环。 2.最少交换次数能形成的最多…