机器学习之线性回归模型

news2025/2/9 9:13:47

1 线性回归模型介绍

        线性回归模型是机器学习中非常基础且经典的模型,是利用线性拟合的方式探寻数据背后的规律,特征变量的个数可将线性回归模型分为一元线性回归和多元线性回归。

(1)一元线性回归

        线性模型的原型为一元一次方程,“元”的概念就是指自变量个数,线性回归是先通过搭建线性回归模型寻找样本点背后的趋势线(也称回归曲线),再利用回归曲线进行一些简单的预测分析或因果关系分析。

        一元线性回归模型是一种用于预测一个自变量和一个因变量之间关系的统计模型。它假设自变量和因变量之间存在线性关系,可以通过线性方程来表示。在一元线性回归模型中,我们有一个自变量(通常表示为x)和一个因变量(通常表示为y)。模型假设自变量x对因变量y的影响是线性的,可以用以下方程表示:

        y = ax + b

其中,y是因变量,x是自变量,b是截距,a是自变量x的系数。截距β0表示当自变量x为0时,因变量y的值。系数a表示自变量x每增加一个单位对因变量y的影响。

        线性回归的目标是通过拟合数据来估计出最优的截距和系数,使得预测值与实际观测值之间的误差最小化。这通常使用最小二乘法来实现,即最小化实际观测值与预测值之间的残差平方和。一旦模型参数估计完成,就可以使用该模型进行预测。给定一个新的自变量x,可以使用估计的截距和系数来计算因变量y的预测值。

        需要注意的是,一元线性回归模型的应用有一些前提假设,包括线性关系、误差项的独立性、误差项的方差恒定等。在使用该模型进行分析时,需要验证这些假设是否成立,并对模型的结果进行解释和评估。

(2)多元线性回归

        在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

        多元线性回归是一种用于预测一个因变量与多个自变量之间关系的统计模型。它是对一元线性回归的扩展,可以同时考虑多个自变量对因变量的影响。在多元线性回归模型中,我们有一个因变量(通常表示为y)和多个自变量(通常表示为x1, x2, ..., xn)。模型假设这些自变量与因变量之间存在线性关系,可以用以下方程表示:

        y = a1x1 + a2x2 + ... + anxn + b

其中,y是因变量,x1, x2, ..., xn是自变量,b是截距,a1, a2, ..., an是各自变量的系数。截距b表示当所有自变量都为0时,因变量y的值。系数a1, a2, ..., an表示各自变量对因变量的影响。

        多元线性回归的目标是通过拟合数据来估计出最优的截距和系数,使得预测值与实际观测值之间的误差最小化。这同样使用最小二乘法来实现,最小化实际观测值与预测值之间的残差平方和。一旦模型参数估计完成,就可以使用该模型进行预测。给定一组新的自变量x1, x2, ..., xn,可以使用估计的截距和系数来计算因变量y的预测值。

        与一元线性回归类似,多元线性回归也有一些前提假设,包括线性关系、误差项的独立性、误差项的方差恒定等。在使用该模型进行分析时,需要验证这些假设是否成立,并对模型的结果进行解释和评估。同时,还可以通过评估系数的显著性和模型的拟合优度来评估模型的有效性。

2 线性回归模型实现波士顿房价预测案例

        波士顿房价预测是一个经典的机器学习问题,可以使用线性回归模型进行预测。在波士顿房价预测问题中,我们需要根据一组特征来预测房屋的价格。

(1)数据集加载

from sklearn import datasets
import pandas as pd

bsd_dataset = datasets.load_boston()
data_df = pd.DataFrame(bsd_dataset.data, columns=bsd_dataset.feature_names)

data_df['price'] = bsd_dataset.target
print(data_df.head(10))

显示的数据结果如下:

      CRIM    ZN  INDUS  CHAS    NOX  ...    TAX  PTRATIO       B  LSTAT  price
0  0.00632  18.0   2.31   0.0  0.538  ...  296.0     15.3  396.90   4.98   24.0
1  0.02731   0.0   7.07   0.0  0.469  ...  242.0     17.8  396.90   9.14   21.6
2  0.02729   0.0   7.07   0.0  0.469  ...  242.0     17.8  392.83   4.03   34.7
3  0.03237   0.0   2.18   0.0  0.458  ...  222.0     18.7  394.63   2.94   33.4
4  0.06905   0.0   2.18   0.0  0.458  ...  222.0     18.7  396.90   5.33   36.2
5  0.02985   0.0   2.18   0.0  0.458  ...  222.0     18.7  394.12   5.21   28.7
6  0.08829  12.5   7.87   0.0  0.524  ...  311.0     15.2  395.60  12.43   22.9
7  0.14455  12.5   7.87   0.0  0.524  ...  311.0     15.2  396.90  19.15   27.1
8  0.21124  12.5   7.87   0.0  0.524  ...  311.0     15.2  386.63  29.93   16.5
9  0.17004  12.5   7.87   0.0  0.524  ...  311.0     15.2  386.71  17.10   18.9

(2)数据归一化

from sklearn.preprocessing import MinMaxScaler
X=bsd_dataset.data
Y=bsd_dataset.target

#数据归一化
X=MinMaxScaler().fit_transform(X)
data_df = pd.DataFrame(X, columns=bsd_dataset.feature_names)
print(data_df.head(10))

归一化后的数据

       CRIM     ZN     INDUS  CHAS  ...       TAX   PTRATIO         B     LSTAT
0  0.000000  0.180  0.067815   0.0  ...  0.208015  0.287234  1.000000  0.089680
1  0.000236  0.000  0.242302   0.0  ...  0.104962  0.553191  1.000000  0.204470
2  0.000236  0.000  0.242302   0.0  ...  0.104962  0.553191  0.989737  0.063466
3  0.000293  0.000  0.063050   0.0  ...  0.066794  0.648936  0.994276  0.033389
4  0.000705  0.000  0.063050   0.0  ...  0.066794  0.648936  1.000000  0.099338
5  0.000264  0.000  0.063050   0.0  ...  0.066794  0.648936  0.992990  0.096026
6  0.000921  0.125  0.271628   0.0  ...  0.236641  0.276596  0.996722  0.295254
7  0.001554  0.125  0.271628   0.0  ...  0.236641  0.276596  1.000000  0.480684
8  0.002303  0.125  0.271628   0.0  ...  0.236641  0.276596  0.974104  0.778146
9  0.001840  0.125  0.271628   0.0  ...  0.236641  0.276596  0.974305  0.424117

(3)划分训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, random_state = 0)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

划分后的结果

(379, 13) (127, 13) (379,) (127,)

(4)启动训练

x=torch.tensor(X_train,dtype=torch.float32).T
y=torch.tensor(y_train,dtype=torch.float32)

w1=torch.randn((10,13),requires_grad=True)
w2=torch.randn((1,10),requires_grad=True)

epochs=2000
learning_rate=0.01

plt_epoch=[]
plt_loss=[]

for epoch in range(epochs):
    #计算隐藏层
    hidden=w1.mm(x)

    #加入激活函数
    hidden=torch.relu(hidden)

    #预测结果
    predictions=w2.mm(hidden)

    #损失函数
    loss=torch.mean((predictions-y)**2)

    plt_epoch.append(epoch)
    plt_loss.append(loss.item())

    #打印损失值
    if epoch%100==0:
        print('epoch:',epoch,'loss:',loss.item())

    #反向传播
    loss.backward()

    #更新权重
    w1.data-=w1.grad*learning_rate
    w2.data-=w2.grad*learning_rate

    #记得清空梯度,不然会一直累加
    w1.grad.zero_()
    w2.grad.zero_()

#绘制迭代次数与损失函数的关系
import matplotlib.pyplot as plt
plt.plot(plt_epoch,plt_loss)
plt.show()

结果输出

epoch: 0 loss: 593.4494018554688
epoch: 100 loss: 22.972753524780273
epoch: 200 loss: 23.377593994140625
epoch: 300 loss: 19.176700592041016
epoch: 400 loss: 18.216825485229492
epoch: 500 loss: 15.251435279846191
epoch: 600 loss: 14.864448547363281
epoch: 700 loss: 13.524547576904297
epoch: 800 loss: 12.281590461730957
epoch: 900 loss: 11.839076042175293
epoch: 1000 loss: 11.74725341796875
epoch: 1100 loss: 11.918133735656738
epoch: 1200 loss: 11.595450401306152
epoch: 1300 loss: 10.907296180725098
epoch: 1400 loss: 10.708924293518066
epoch: 1500 loss: 10.780670166015625
epoch: 1600 loss: 10.737732887268066
epoch: 1700 loss: 11.010161399841309
epoch: 1800 loss: 9.786482810974121
epoch: 1900 loss: 10.003388404846191

(5)测试集验证

#测试数据
x_t=torch.tensor(X_test,dtype=torch.float32).T
y_t=torch.tensor(y_test,dtype=torch.float32)

hidden=w1.mm(x_t)
hidden=torch.relu(hidden)

#预测结果
predictions=w2.mm(hidden)

#损失函数
loss=torch.mean((predictions-y_t)**2)
print('loss:',loss.detach().item())

输出结果:

loss: 23.49477195739746

3 完整代码

详见:代码下载

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

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

相关文章

多线程/WinAPI线程退出方式比较分析

文章目录 概述ExitThreadTerminateThread进程退出逼迫线程退出?线程入口函数返回验证无法执行C对象析构不同方案的比较参考或关联 概述 关于如何终止 Windows 线程,在 MSDN Terminating a Thread 一文中列举的很详细: A thread executes until one of …

python数据赋值后,修改新数据,原数据如何保证不被修改?

目录 1.deepcopy 2.实战演练 3.python中的变量实质 好文推荐:传送锚点 1.deepcopy python中对象,赋值后是同一地址,如果是可变对象,对其中一个修改会影响到另一个,如果要生成完全新的对象,应使用&#…

使用Gogs搭建自己的github服务器

文章目录 下载Gogs配置和启动让gogs保持运行 使用参考资料 Gogs官方网址:https://gogs.io/ 下载Gogs 在官网首页可以找到二进制运行,点击进去 让咱们去 github 咱们就去 github 看看好了。https://github.com/gogs/gogs/releases 找到自己需要的版本。 …

【OpenMMLab AI实战营第二期】语义分割与MMSegmentation

MMSegmentation 开源代码仓:https://github.com/open-mmlab/mmsegmentation 算法丰富:600预训练模型、40篇算法复现 模块化设计:配置简便、容易拓展 统一超参:大量消融实验、支持公平对比 使用方便:训练工具、调试…

Python处理办公自动化的10大场景

在编程世界里,Python已经是名副其实的网红了。Python最大优势在于容易学,门槛比Java、C低非常多,给非程序员群体提供了用代码干活的可能性。当然Python能成为大众编程工具,不紧是因为易学,还因为Python有成千上万的工具…

2. CompletableFuture

2.1 Future接口理论知识复习 Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 举例:比如主线程让一个子线程去执行任…

python中的map函数

1. map()函数的简介以及语法: 1.1 map是python内置函数,会根据提供的函数对指定的序列做映射。 1.2 map()函数的格式是: map(function,iterable,...) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列 1.3 map的返…

linux基本功之高效学习Linux命令行工具的技巧:Pandoc实战

前言 大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第65篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象&am…

F407之位带操作

位带操作的应用场景,通常在于对IO口进行输入输出读取和控制。 这就和51单片机中直接的端口赋值是一样的。 比如 P0.0 0; P0.0 1; 直接就是对端口P0.0输出0和1。 如何实现呢? 什么是位带操作 位带操作简单的说,就是把每个比特膨胀为一个32位…

全面了解AES加密:入门指南

文章目录 I. 介绍A. 什么是加密B. 为什么要加密1. 保护数据的机密性2. 防止数据被篡改3. 防止数据被窃取4. 保护数据的可信度 C. AES加密的概述 II. 对称加密与非对称加密A. 对称加密的定义和特点1. 简单快速2. 安全性较低3. 适合大量数据加密4. 密钥管理困难5. 用途广泛 B. 非…

黑马版Redis基础篇

一、 初识redis 1.1 认识 NoSQL 关系型数据库: 1.2 认识Redis 二、Redis 常见命令 2.1 Redis 数据结构介绍 2.2 Redis 通用命令 2.3 String 类型 2.3.1 Key的层级格式 2.4 Hash 类型 2.5 List 类型 2.6 Set 类型 2.7 SortedSet 类型 三、Redis 的 Java 客户端 1.…

DelayQueue的核心属性和写入、读取流程分析

DelayQueue的核心属性 DelayQueue的写入流程分析 add方法也是包装使用offer方法。Delay是无解的,数组又可以动态扩容,不需要关注生产者的阻塞问题 offer方法分析 DelayQueue读取流程 消费者消费元素存在两种阻塞的情况: 1.消费者得到栈顶的…

华为OD机试真题 JavaScript 实现【预定酒店】【2022Q4 100分】

一、题目描述 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的 数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店 (n>k>0) ,并由低到高打印酒店的价格。 二、输入描述 第一行: n,…

chatgpt赋能python:Python怎么开三次方?

Python怎么开三次方? Python是一门常用的高级编程语言,被广泛用于数据分析、人工智能、Web开发等领域。在Python中,我们可以使用几种方法轻松地计算三次方根,例如使用sqrt函数、cbrt函数和简单的数学表达式。本文将介绍三种方法&…

聊聊Scrum三大角色的质量意识和文化建设

这是鼎叔的第六十三篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。 参考前文:聊聊Scrum价值观与测试启发 本篇从Scrum的主要角色视角…

开关电源精确到每个元件-分解电源电路

本次讲解电源以一个13.2W电源为例 输入:AC90~264V 输出:3.3V/4A 原理图: 变压器是整个电源供应器的重要核心,所以变压器的计算及验证是很重要的。 1.决定变压器的材质及尺寸: 依据变压器计算公式 2.决定一次侧滤波电容&#…

第五章JMM内存模型

文章目录 计算机硬件存储体系为什么要弄一个 CPU 高速缓存呢?为什么缓存能提高速度呢?缓存带来的问题 Java之JMM模型JMM 是如何抽象线程和主内存之间的关系线程之间如何通信Java 内存区域和 JMM 有何区别 JMM规范下,三大特性原子性可见性有序…

000mysql常用资源推荐

官网 MySQL :: MySQL 8.0 Reference Manualhttps://dev.mysql.com/doc/refman/8.0/en/ 博客 一树一溪 侧重原理https://mp.weixin.qq.com/mp/homepage?__bizMzg3NTc3NjM4Nw&hid2&snb5d65ce17893a722b6748b471412eab0&scene1&devicetypeandroid-33&ver…

Spring-Boot的创建与配置文件

文章目录 前言Spring与SpringBoot的区别SpringBoot的创建与使用 更改国内源配置SpringBoot目录介绍SpringBoot配置文件配置⽂件的格式properties 基本语法yml的基本语法yml的注意事项 properties VS yml 好坏 前言 前面讲述了 ,Spring的概念与使用方法 , 接下来要介绍的是 Spr…

华为OD机试真题 JavaScript 实现【服务中心选址】【2023Q1 100分 】

一、题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址,使服务中心到所有区域的距离的总和最小。 给你一个数组 positions,其中 positions[i] [le…