当前位置: 首页 > news >正文

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

线性回归算法

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

一、摘要

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

二、线性回归算法概述

  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.凸优化是最优化原理的一个分支领域,解决一类特殊的优化问题。

相关文章:

  • Vue2/Vue3分别如何使用Watch
  • K8S下载离线安装包所需文件
  • 主流大模型技术全景报告 (2024 Q3)
  • AI知识库 - Cherry Studio
  • Ollama命令使用指南
  • 【AI-34】机器学习常用七大算法
  • 前端基础知识小结
  • Hutool - AOP:JDK 动态代理封装与非 IOC 下的切面支持
  • C++17中的clamp函数
  • PyQt组态软件 拖拽设计界面测试
  • Java 设计模式之组合模式
  • 深入浅出:在Vue中实现单点登录(SSO)的完整指南
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(6):動詞ない形について句型
  • 使用HX搭建UNI-APP云开发项目(适合新手小白与想学云开发的宝子)
  • DeepSeek进阶
  • 四、自然语言处理_08Transformer翻译任务案例
  • 基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
  • @runtime_checkable 装饰器
  • Android WindowContainer窗口结构
  • 基于springboot 以及vue前后端分离架构的求职招聘系统设计与实现
  • 提升网站权重/百度账号登录入口
  • 深圳手机app软件开发/重庆做seo外包的
  • 国外做电商网站有哪些/营销怎么做
  • 简约网页设计/河南seo网站多少钱
  • 网站首页包括哪些内容/郑州网站策划
  • 青岛网站建设的方案/抖音关键词挖掘工具