【机器学习】简单线性回归算法及代码实现

news2025/2/19 3:05:26

线性回归算法

  • 一、摘要
  • 二、线性回归算法概述
  • 三、损失函数的定义和衡量标准
  • 四、简单线性回归的求解和应用
  • 五、机器学习算法一般求解思路

一、摘要

本文讲解了线性回归算法的基础知识和应用,强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系,展示了线性回归的基本思想。文中提到线性回归算法的实现简单,但背后有强大的数学支撑。介绍了简单线性回归与多元线性回归的区别,并解释了如何通过最小二乘法找到最佳拟合直线。同时,探讨了线性回归算法的可解释性以及在机器学习中的重要地位,指出它是许多复杂模型的基础。此外,还提到了最优化原理在机器学习算法中的应用,以及如何通过线性回归算法学习机器学习中的重要思想。

二、线性回归算法概述

  1. 线性回归算法是机器学习领域的重要算法,主要用于解决回归问题,属于监督学习。

  2. 线性回归算法思想简单,实现容易,背后具有强大的数学性质。

  3. 线性回归算法是许多非线性模型的基础,如多项式回归逻辑回归SVM

  4. 线性回归算法结果具有很好的可解释性,可以通过数据分析学习真实世界的知识。

  5. 线性回归算法的主要目的是通过数据拟合一条直线,最好地预测因变量(目标变量)

  6. 线性回归算法的数学原理

    • 1.线性回归算法假设样本特征与样本输出标记之间存在线性关系
    • 2.通过找到一条直线,最大程度拟合样本特征和样本输出标记之间的关系
    • 3.二维平面图中,每个点表示一个数据,横轴代表样本特征纵轴代表样本输出标记
      在这里插入图片描述
  7. 线性回归分类

    • 简单线性回归
      • 简单线性回归为 y=a+bx,其中a是截距,b是斜率;
      • 1.简单线性回归假设样本特征只有一个,如房屋面积。
      • 2.通过找到最佳拟合直线方程y=ax+b,预测样本输出标记的值。
      • 3.预测值y[^i]表示为a×xi+b,其中xi是样本特征值。
      • 4.真实值y预测值y[^i]之间的差距称为误差,线性回归算法的目标是寻找到一个函数,通过找到最佳的a和b,使得该函数的值尽可能很小,这个函数称之为损失函数。
        在这里插入图片描述
    • 多元线性回归
      多元线性回归扩展到多个自变量。
  8. 线性回归算法的工作流程

    • 数据准备 :确保自变量和因变量独立且同分布,数据标准化可能有助于准确性。
    • 模型建立 :选择损失函数(如最小二乘法)并通过优化算法(如梯度下降或随机森林)拟合模型。
    • 评估与调优 :使用交叉验证评估模型性能,防止过拟合。
  9. 线性回归算法的应用场景

    • 预测分析 :如房价、温度与气压、存活率等。
    • 质量控制 :通过维度的影响评估产品性能。
    • 经济预测 :用于股票价格或消费水平预测。

三、损失函数的定义和衡量标准

  1. 损失函数用于衡量真实值与预测值之间的差距。
  2. 常用的一种损失函数平方误差损失函数,通过计算误差的平方来衡量差距。在线性回归中,损失函数通常表示为平方误差函数,即预测值与真实值之差的平方和。使用平方误差损失函数的原因包括其处处可导性,便于后续的数学计算。
  3. 求函数极值的基本方法是求导数并令导数等于零。通过对损失函数y分别对a和b求导,并令导数等于零,可以找到使损失函数最小的a和b值。

四、简单线性回归的求解和应用

  1. 简单线性回归的求解包括找到参数a和b的最小二乘解。

  2. 通过最小二乘法,a和b的求解有了直接的数学表达式。
    在这里插入图片描述
    最小二乘法是一种数学优化技术,通过最小化误差的平方和来寻找数据的最佳函数匹配。在监督学习中,最小二乘法用于拟合线性回归模型,通过最小化预测值与真实值之间的平方误差之和,来求解模型的参数。

  3. 简单线性回归的求解思路可以推广到多元线性回归的情况。

  4. 具体实现过程

    • 实现思路及步骤
      • 1.加载相应的库,并使用假数据进行线性回归过程。
      • 2.创建xy两个np数组,并绘制散点图。
      • 3.计算x和y的均值,并使用公式计算a和b。
      • 4.a的计算包括分子和分母两部分,通过循环求和计算。
      • 5.b的计算直接使用公式y的均值减去a乘以x的均值。
      • 6.绘制ax+b的直线图,并显示预测结果。
    • 代码实现过程
      • 1.先导入相关库,定义好测试数据及该数据在二维平面上的散点图分布:

        # 导入型相关的库
        import numpy as np
        import matplotlib.pyplot as plt
        
        # 定义x和y两个向量
        x = np.array([1.,2.,3.,4.,5.])
        y = np.array([1.,3.,2.,3.,5.])
        
        # 先二维平面上绘图查看数据分布
        plt.scatter(x,y)
        plt.axis([0,6,0,6])  # 定义横纵坐标值的范围为[0,6]
        plt.show()
        

        执行效果如下:
        在这里插入图片描述

      • 2.根据公式求解线性方程y=ax + b

        # 先分别求出x和y的均值
        x_mean = np.mean(x)
        y_mean = np.mean(y)
        
        # 先求a的分子部分
        numerator = 0.0 # 分子
        denominator = 0.0 # 分母
        for x_i,y_i in zip(x,y):
            numerator += (x_i - x_mean) * (y_i - y_mean)
            denominator += (x_i - x_mean)**2
        
        # 然后在求出a的值
        a = numerator / denominator
        # 最后再求出b的值
        b = y_mean - a*x_mean
        # 此时可以得到线性方程中的预测值y_hat
        y_hat = a * x + b
        # 为了好看,将y_hat这条直线绘制出来
        plt.scatter(x,y) # 5个点的散点图
        plt.plot(x,y_hat,color='r') # 绘制直线,x还是原来的向量x(自变量),y_hat就是求出来的值(因变量)
        plt.axis([0,6,0,6])
        plt.show()
        

        执行效果如下:
        在这里插入图片描述

      • 3.给定假设的新样本点,带入线性回归方程中,求得预测值:

        # 给一个假设的新的样本点x_predict
        x_predict = 6
        # 调用我们的模型y=ax + b,得到一个预测值y_predict
        y_predict = a * x_predict + b
        print("预测值=",y_predict)
        

        执行效果如下:
        在这里插入图片描述

  5. 按照scikit-learn的代码风格,将上述代码进行封装

    • 1.创建一个simple linear regression.py文件,定义SimpleLinearRegression类。
    • 2.构造函数初始化a和b参数,使用下划线命名表示这些是算法计算结果。
    • 3.fit函数接收训练数据x和y,计算a和b并保存。
    • 4.predict函数接收预测数据x,使用已计算的a和b进行预测。
    • 5.输出a和b的值,以及预测结果。
    • 6.在PyCharm中封装完成后的代码如下:
      import numpy as np
      
      
      class SimpleLinearRegressionModel:
          def __init__(self):
              # 初始化线性回归模型的参数a和b为None
              self.a_ = None
              self.b_ = None
      
          def fit(self, x_train, y_train):
              """
              根据训练数据集x_train,y_train训练Simple Linear Regression模型
              """
              # 断言x_train的维度为1,确保是单特征训练数据
              assert x_train.ndim == 1, \
                  "Simple Linear Regressor can only solve single feature training data."
              # 断言x_train和y_train的长度相等,确保数据匹配
              assert len(x_train) == len(y_train), \
                  "the size of x_train must be equal to the size of y_train"
      
              # 先分别求出x和y的均值
              x_mean = np.mean(x_train)
              y_mean = np.mean(y_train)
      
              # 先求a的分子部分
              numerator = 0.0  # 分子
              denominator = 0.0  # 分母
              # 遍历训练数据,计算分子和分母
              for x_i, y_i in zip(x_train, y_train):
                  numerator += (x_i - x_mean) * (y_i - y_mean)
                  denominator += (x_i - x_mean) ** 2
      
              # 然后计算a的值
              self.a_ = numerator / denominator
              # 最后计算b的值
              self.b_ = y_mean - self.a_ * x_mean
      
              return self
      
          def predict(self, x_predict):
              """
              给定待预测数据集x_predict,返回表示x_predict的结果向量
              """
              # 断言x_predict的维度为1,确保是单特征数据
              assert x_predict.ndim == 1, \
                  "Simple Linear Regressor can only solve single feature training data."
              # 断言模型已经训练过(a_和b_不为None)
              assert self.a_ is not None and self.b_ is not None, \
                  "must fit before predict!"
      
              # 对每个待预测数据调用_predict方法,生成预测结果数组
              return np.array([self._predict(x) for x in x_predict])
      
          def _predict(self, x_single):
              """
              给定单个待预测数据x_single,返回x_single的预测结果值
              """
              # 根据训练得到的参数a_和b_进行预测计算
              return self.a_ * x_single + self.b_
      
          def __repr__(self):
              # 返回模型的字符串表示形式
              return "SimpleLinearRegressionModel()"
      
    • 7.在jupyter中调用并预测:
      1.实例化SimpleLinearRegression类,无需传入参数。
      2.调用fit方法传入x和y数据,训练模型。
      3.调用predict方法进行预测,传入预测数据x。
      4.输出预测结果,以及学到的a和b参数。
      5.绘制原始数据和预测直线的图表。
      # 导入在PyCharm中封装好的工程项目
      import sys
      project_path = 'D:/PycharmProjects/pythonProject/'
      if project_path not in sys.path:
          sys.path.append(project_path)
          from SimpleLinearRegressionModel import SimpleLinearRegressionModel
          sreg = SimpleLinearRegressionModel()
          sreg.fit(x,y)
          # 给一个假设的新的样本点x_predict
      x_predict = 6
      sreg.predict(np.array([x_predict]))
      
      执行结果:
      在这里插入图片描述
      绘制图像查看下:
      在这里插入图片描述

五、机器学习算法一般求解思路

  1. 机器学习算法的求解思路包括确定目标函数最优化该函数

  2. 目标函数可以是损失函数效用函数

  3. 参数学习算法通过学习模型的参数来最优化目标函数。
    在这里插入图片描述
    近乎所有参数学习算法都是如图所示的套路。
    在这里插入图片描述

  4. 最优化原理在机器学习算法中发挥着重要作用,常见如最优化原理和凸优化。

    • 1.最优化原理不仅用于机器学习算法,也在传统计算机算法领域中发挥重要作用。
    • 2.凸优化是最优化原理的一个分支领域,解决一类特殊的优化问题。

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

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

相关文章

AI-大模型(3)-MoE模型

1.什么是MOE模型 多个领域专家共同工作,并行计算。 2.MOE如何工作 gate层:根据输入Token选择专家 基于Token来选择专家 Gate层选择专家 除专家外,其他层共享一个token可以选择多个专家 一个token 可以选择一个专家或者多个专…

PySide(PyQT)使用场景(QGraphicsScene)进行动态标注的一个demo

用以标注图像的一个基本框架demo import sys from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QMainWindow, QLabel, QGraphicsPixmapItem from PySide6.QtGui import QPixmap, QPainter, QTransform from PySide6.QtCore import Qt, QPointF, S…

w206基于Spring Boot的农商对接系统的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

C++类和对象进阶:拷贝构造函数深度详解

拷贝构造函数 拷贝构造函数前言引入拷贝构造函数特征拷贝构造函数建议参数加上const 拷贝构造函数参数传值会引发无穷递归的解释内置类型传参拷贝自定义类型传参拷贝详细解释 编译器生成的默认拷贝构造函数默认构造函数做了什么?深拷贝与浅拷贝简单实现一个深拷贝。…

像取快递一样取文件?

看到一个很有意思的项目,像我们做软件分享的感觉会有用,就是现在服务器费用太贵了,如果自建的话感觉不是很值得。 FileCodeBox FileCodeBox 是一个轻量级的文件分享系统,它基于匿名口令分享文本和文件,无需注册登录&…

DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

【前端开发学习笔记15】Vue_8

手动添加Pinia到Vue项目: 在实际开发中,Pinia配置可在项目创建时自动添加。初次学习从零开始: 1. 用Vite创建空的Vue3项目,命令为npm create vuelatest。 2. 按官方文档将pinia安装到项目中。 import { createApp } from vue im…

通过docker启用rabbitmq插件

创建文件,docker-compose.yml services:rabbitmq:image: rabbitmq:4.0-managementports:- "5672:5672"- "15672:15672"volumes:- ./data/rabbitmq/data:/var/lib/rabbitmq # 持久化数据- ./data/rabbitmq/plugins/rabbitmq_delayed_message_ex…

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 与基于 openEuler 构建 LVS-DR 群集

一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 NAT 模式 部署简单:NAT 模式下,所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转换,就可以实现负载均衡功能。不需要对…

C++17 中 std::lcm:从入门到精通

文章目录 一、引言二、std::lcm 的基本概念三、入门示例四、计算多个整数的最小公倍数五、std::lcm 的实现原理六、在实际项目中的应用七、注意事项八、总结 一、引言 在 C 编程中,处理数学运算时,计算最小公倍数(Least Common Multiple&…

html 点击弹出视频弹窗

一、效果: 点击视频按钮后,弹出弹窗 播放视频 二、代码 <div class="index_change_video" data-video-src="</

代码随想录算法【Day44】

Day44 1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<int>(text2.size() 1, 0));for (int i 1; i < text1.size(); i) {for (int j 1; …

项目总结:java agent的使用

测试团队会做java agent的事&#xff0c;实现测试模拟&#xff0c;各种数据采集等等工作&#xff0c;而这些不需要开发改代码来做到&#xff0c;只需要挂载下agent。 目录 javaagent认识和例子代码例子&#xff1a;java.lang.instrument自定义实现一个javaagentagent jar测试 回…

如何借助NoETL指标平台实现数据分析、决策的提效?

通常&#xff0c;企业通过明确分析目标、定位所需分析的数据&#xff0c;再通过多渠道汇集销售数据、客户反馈、市场调研等信息&#xff0c;经过数据清洗、缺失值处理及格式标准化等手段&#xff0c;运用描述性统计、回归分析、聚类分析及关联规则挖掘等多样分析方法&#xff0…

大模型语言简介

大模型语言能做什么 信息提取 将长段文字中的信息抽取出来并且以结构化的方式输出。相比起传统NLP的方式&#xff0c;大模型在泛化能力上有非常大的提升&#xff0c;并且开发成本要低2个数量级。应用场景包括&#xff1a;论文论点论据提取、用户画像提取、舆情分析、病例结构…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

Golang 进阶训练营

一、Golang 的 slice、map、channel 1.1 slice vs array a : make([]int, 100) //切片 b : [100]int{} //数组array需指明长度&#xff0c;长度为常量且不可改变 array长度为其类型中的组成部分&#xff08;给参数为长度100的数组的方法传长度为101的会报错&#xff09; array在…

2-使用wifidog实现portal

wifidog是openwrt上面实现portal认证的一个开源工具&#xff0c;从网关端到服务器都帮你搭建好&#xff0c;通过学习wifidog的原理&#xff0c;后面就可以改造成自己需要的逻辑。 1. openwrt安装wifidog 添加源 vim 14.07/feeds.conf.defaultsrc-git wifidog https://github.c…

AI时代前端开发的创造力:解放还是束缚?

在人工智能&#xff08;AI&#xff09;快速发展的时代&#xff0c;AI技术的影响已经渗透到各个领域&#xff0c;从医疗保健到金融服务&#xff0c;再到创意产业。AI工具的出现&#xff0c;为前端开发带来了前所未有的效率提升&#xff0c;但也引发了人们对创造力的担忧&#xf…

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展&#xff0c;越来越多的企业意识到在数字营销中&#xff0c;网站的曝光度和排名至关重要。无论是想要提高品牌知名度&#xff0c;还是想要通过在线销售增加收益&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是一项不可忽视的关键策略。而要…