第十九周:机器学习

目录

摘要

Abstract

一、吴恩达机器学习Exp1——线性回归

1、单变量线性回归

1.1数据集的读取及可视化

1.2分割训练集和验证集

1.3扩展维度

1.4线性回归模型 

1.5训练过程可视化

2、多变量线性回归

2.1加载数据集并可视化

2.2划分训练集和验证集

2.3线性回归模型

2.4训练过程可视化

二、李沐动手深度学习——数据集

总结


摘要

本周复习了线性回归模型的基本概念、步骤以及应用场景,进一步延伸到代码层面。动手实践了吴恩达机器学习实验1——线性回归,单变量线性回归和多变量线性回归分别用sklearn库的LinearRegression模型和自定义线性回归模型训练数据并且进行预测,最终得出效率和准确率的对比。该实验不仅复习了模型训练的基本步骤,还进一步手动代码实现了模型的定义、损失函数的设置以及最优化的处理。为了更加熟悉pytorch框架的基本知识,本周还简单学习了torch的数据处理方式。

Abstract

This week, we reviewed the basic concepts, steps, and application scenarios of linear regression modeling, and further extended to the code level. We have practiced the Ernst & Young Wu Machine Learning Experiment 1 - Linear Regression. Univariate linear regression and multivariate linear regression were used to train the data and make predictions using the LinearRegression model and custom linear regression model of sklearn library respectively, and finally, we have the comparison of the efficiency and accuracy rate. The experiment not only reviews the basic steps of model training, but also further implements the model definition, loss function setting and optimization processing by manual code. In order to become more familiar with the basics of the pytorch framework, this week also briefly learned how to handle data in torch.

一、吴恩达机器学习Exp1——线性回归

在前面的李宏毅深度学习中,学习了线性回归的基本训练步骤:建立模型——>设置损失函数——>最优化。详见周报(二)

线性回归字面来看,就是通过历史已知数据来预测未来数据。

1、单变量线性回归

 单变量线性回归就是找到一维方程,拟合一条直线。

step1 建立模型

h_{w,b}(x)=wx+b

step2 损失函数

J(w,b)=1/{2m}\sum_{i=1}^{m}{(h_{w,b}(x^{(i)})-y^{(i)})^2}

step3 最优化

在机器学习算法中,对于很多监督学习模型,需要对原始的模型构建损失函数,接下来便是通过优化算法对损失函数进行优化,以便寻找到最优的参数。

在机器学习的参数优化算法中,梯度下降优化算法是最常见的。

采用批梯度下降法 

 

1.1数据集的读取及可视化

data = np.loadtxt('ex1data1.txt', delimiter=',')
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(x=data[:, 0], y=data[:, 1], s=10)
plt.show()

 

1.2分割训练集和验证集

from sklearn.model_selection import train_test_split
train_x, val_x, train_y, val_y = train_test_split(data[:, 0], data[:, 1], test_size=0.5)
# train_x, val_x, train_y, val_y = data[:, :-1], data[:, :-1], data[:, -1], data[:, -1]fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(x=train_x, y=train_y, s=10, label="Train")
ax.scatter(x=val_x, y=val_y, s=10, color="red", label="Validation")
ax.legend()
plt.show()

1.3扩展维度

train_x_ex = np.expand_dims(train_x,axis=1)
train_y_ex = np.expand_dims(train_y,axis=1)
val_x_ex = np.expand_dims(val_x,axis=1)
val_y_ex = np.expand_dims(val_y,axis=1)

1.4线性回归模型 

方法一:自己定义线性回归模型

定义回归模型

需要自定义两个:一个是线性回归类”Linear_Regression“、一个是误差函数”square_loss”

(1)误差函数

def square_loss(pred, target):return np.sum(np.power((pred - target), 2)) / (2 * pred.shape[0])

其中pred是预测值、target是真实值 

(2)线性回归

  传参

class LinearRegression:def __init__(self, x, y, val_x, val_y, epoch=100, lr=0.1, regularize=False, scale=0):self.theta = Noneself.loss = []self.val_loss = []self.n = x.shape[0]self.d = x.shape[1]self.epoch = epochself.lr = lrt = np.ones(shape=(self.n, 1))self.x_std = x.std(axis=0)self.x_mean = x.mean(axis=0)self.y_mean = y.mean(axis=0)self.y_std = y.std(axis=0)x_norm = (x - self.x_mean) / self.x_stdself.y = yself.x = np.concatenate((t, x_norm), axis=1)self.val_x = val_xself.val_y = val_yself.regularize = regularizeself.scale = scale

其中x是样本、y是标签、epoch是训练迭代次数、lr是学习率、regularize代表是否归一化

  参数初始化

    def init_theta(self):self.theta = np.zeros(shape=(1, self.d + 1))def validation(self, x, y):x = (x - x.mean(axis=0)) / x.std(axis=0)# y = (y - y.mean(axis=0)) / y.std(axis=0)outputs = self.predict(x)curr_loss = square_loss(outputs, y)return curr_loss

theta是记录 、validation是记录当前损失值 

   梯度下降

    def gradient_decent(self, pred):error = pred - self.y  # error (n,1)误差:预测-标签gradient = np.matmul(self.x.T, error)  # gradient (d+1, 1) 矩阵乘法:计算梯度,这是损失函数相对于参数 theta 的导数gradient = gradient.T / pred.shape[0]  # average gradient (1,d+1) 将梯度转置并除以样本数量,得到平均梯度。if self.regularize:  #是否需要正则化reg_term = self.scale / self.n * self.theta[:, 1:]  #计算正则化项reg_term[:, 0] = 0  #将正则化项的第一个元素设置为0,因为偏置项不进行正则化gradient = gradient + reg_term   #将正则化项加到梯度上self.theta = self.theta - (self.lr / self.n) * gradient #更新参数

  训练线性回归模型

def train(self):self.init_theta()  #调用“theta的初始化函数”for i in range(self.epoch):    #迭代训练pred = np.matmul(self.theta, self.x.T) #计算预测值predpred = pred.T #调整pred的形状curr_loss = square_loss(pred, self.y)  #计算当前的训练损失val_loss = self.validation(self.val_x, self.val_y)  #调用“validation方法”计算验证集损失self.gradient_decent(pred)   #更新模型参数thetaif self.regularize:   #判断是否正则化curr_loss = curr_loss + (self.scale / (2 * self.n)) * np.power(self.theta[:, 1:], 2).sum()val_loss = val_loss + (self.scale / (2 * self.n)) * np.power(self.theta[:, 1:], 2).sum()self.val_loss.append(val_loss)self.loss.append(curr_loss)  #将当前的训练损失和验证损失添加到损失序列中print("Epoch: {}/{}\tTrain Loss: {:.4f}\tVal loss: {:.4f}".format(i + 1, self.epoch, curr_loss, val_loss))   #打印每个周期的训练损失和验证损失# 反归一化参数self.theta[0, 1:] = self.theta[0, 1:] / self.x_std.Tself.theta[0, 0] = self.theta[0, 0] - np.dot(self.theta[0, 1:], self.x_mean)return self.theta, self.loss, self.val_loss

模型的训练这个函数主要包含两个部分:一个是迭代训练的过程(计算损失、梯度下降、更新参数、正则化) ,另一个是反归一化的过程

   回归预测

    def predict(self, x):t = np.ones(shape=(x.shape[0], 1))x = np.concatenate((t, x), axis=1)pred = np.matmul(self.theta, x.T)return pred.T

其中参数x是输入样本,最终返回的pred.T是预测结果 

训练参数记录 

linear_reg.fit(train_x_ex, train_y_ex)from Linear_Regression import LinearRegressionepochs = 200
alpha = 1
linear_reg = LinearRegression(x=train_x_ex,y=train_y_ex,val_x=val_x_ex, val_y=val_y_ex, lr=alpha,epoch=epochs) #记录参数矩阵
start_time = time.time() #记录训练时间 
theta,loss, val_loss = linear_reg.train() #记录损失函数序列
end_time = time.time()#查看训练时间,计算在验证集上的损失
print("Train Time: {:.4f}s".format(end_time-start_time))
from Linear_Regression import square_loss
pred_val = linear_reg.predict(val_x_ex)
loss_val = square_loss(pred_val, val_y_ex)
print("Val Loss: {:.4f}".format(loss_val))

 

 

方法二:用sklearn库直接进行模型预测 

用sklearn库进行验证

from sklearn.linear_model import LinearRegression
sklearn_lr = LinearRegression()
sk_start_time = time.time()
sklearn_lr.fit(train_x_ex,train_y_ex)
sk_end_time = time.time()sk_theta = [sklearn_lr.intercept_[0],sklearn_lr.coef_[0, 0]]
sk_lr_pred = sklearn_lr.predict(val_x_ex)from Linea_Regression import square_loss
sk_loss_val = square_loss(sk_lr_pred, val_y_ex)
print("Sklearn Val Loss: {:.4f}".format(sk_loss_val))
print("Sklearn Parameters: ", sklearn_lr.intercept_, sklearn_lr.coef_)
print("Sklearn Train Time: {:.4f}s".format(sk_end_time-sk_start_time))

综上所述,自定义模型无论在效率还是准确率方面都表现较好。 

1.5训练过程可视化

1.5.1预测直线  

1.5.2训练损失函数 

2、多变量线性回归

2.1加载数据集并可视化

data2 = np.loadtxt('ex1data2.txt', delimiter=',')
plt.figure(dpi=150)
ax = plt.axes(projection='3d')
ax.scatter3D(data2[:,0],data2[:,1],data2[:,2],s=10)
plt.show()

 

2.2划分训练集和验证集

代码同上

下面的步骤,比如模型训练的时间及验证集的损失的记录,将自己定义的模型与sklearn中的调用模型进行对比。

2.3线性回归模型

如上图结果所示, 左边是自定义的模型训练、右边是sklearn库中的自带模型训练,总的来说,无论是效率还是准确率方面自定义都不如sklearn库中的模型。

2.4训练过程可视化

2.4.1预测

2.4.2训练损失函数 

 

二、李沐动手深度学习——数据集

前面动手跑模型是为了完成李宏毅深度学习的课程作业,对于pytorch的理解不是很深,接下来将跟着动手逐行学习深度学习。

张量的形状和大小

import torch
x = torch.arange(12)
x,x.shape,x.numel()

 

把多个张量结合在一起

x = torch.arange(12, dtype=torch.float32).reshape((3,4))
y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((x, y), dim=0), torch.cat((x,y), dim=1)

 

torch.cat() 方法主要是拼接两个张量,其中的dim参数决定两个张量拼接的维度是哪个。比如上述,dim=0代表二者是在第一个维度进行拼接(也就是最外层括号),dim=1代表二者在第二个维度进行拼接(也就是从外数第二个括号)

通过逻辑运算符构建二元张量 

x == y

 

输出的张量是布尔表示的。 

广播机制 

a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape(1,2)
a,b,a+b

 

通过调用广播机制broadcasting mechanism,来执行按元素操作。它将一个进程中的张量(tensor)或数据广播到所有其他进程。

转化为numpy张量 

A = x.numpy()
B = torch.tensor(A)
type(A), type(B)

 

总结

本周侧重于代码实践部分,一部分是pytorch的简单数据处理,另一部分是线性回归模型的代码编写,包含了模型定义、损失函数计算以及最优化的处理过程。下周继续学习机器学习的实验和深度学习的pytorch的基础代码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中,如何延长电池的使用寿命是大家非常关心的问题,而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池,因此长时间的充电与长时间放点都不可取,但是在日常的使用过程中…

Python 爬虫数据清洗与存储:基础教程

Python 爬虫数据清洗与存储:基础教程 在爬虫数据获取完成后,数据往往是“原始”的,不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法,帮助新手…

【博主推荐】VUE开发常用技术点收集

文章目录 1.系统主题的全局颜色变量申明和使用2.样式里面导入样式3.页面返回顶部功能4.页面实时更新时间功能5.页面条件判断的几种方式6.页面v-for使用7.页面路由跳转的几种方式8.vue3 js引用的几种方式9.Vue中引用和使用一个组件10.页面传参的几种方式VUE系列前端模板源码其他…

day08(单片机)时钟系统+定时器+PWM

目录 时钟系统定时器PWM 时钟系统 时钟基本概念 时钟源 晶体振荡器(Crystal Oscillator) RC振荡器(Resistor-Capacitor Oscillator) ​​​​​​​STM32U5时钟源 HSI(High Speed Internal) HSE(High Speed External) LSI(Low Spe…

linux盘扩容缩容

这里写目录标题 文件格式介绍问题:当根盘满了过后怎么办?解决方式: Xfs文件格式缩容扩容1. 备份2. 卸载home3. 缩容home(home盘为xfs文件格式)4. 扩容 /5. 恢复home备份 Ext4文件格式缩容扩容1. 备份(可选&…

通过DNS服务器架构解释DNS请求过程

在前面的章节,这里,基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中,DNS请求和响应的数据包是怎么流动的,会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。 当前网络空间中比较常见DNS请求的流程如下…

【GeoJSON在线编辑平台】(2)吸附+删除+挖孔+扩展

前言 在上一篇的基础上继续开发,补充上吸附功能、删除矢量、挖孔功能。 实现 1. 吸附 参考官方案例:Snap Interaction 2. 删除 通过 removeFeature 直接移除选中的要素。 3. 挖孔 首先是引入 Turf.js ,然后通过 mask 方法来实现挖孔的…

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看,不能交互,信号槽可以让界面进行人机…

Unity引擎智能座舱解决方案

作为全球领先的 3D 引擎之一,Unity引擎为车载3D HMI提供全栈支持。即为从概念设计到量产部署的整个 HMI 工作流程提供创意咨询、性能调优、项目开发等解决方案,从而为车载信息娱乐系统和智能驾驶座舱打造令人惊叹的交互式体验。 专为中国车企打造的HMI引…

<项目代码>YOLOv8 草莓成熟识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

stm32 踩坑笔记

串口问题: 问题:会改变接收缓冲的下一个字节 串口的初始化如下,位长度选择了9位。因为要奇偶校验,要选择9位。但是接收有用数据只用到1个字节。 问题原因: 所以串口接收时会把下一个数据更改

14、NAT和桥接区别

一、NAT模式 NAT相当于是局域网中的局域网,把192.168.21.1当作外网ip,重新划分了一个网关(192.168.33.x) 二、桥接模式 网桥只是把网络桥接起来,还是原来的网关(192.168.21.x),虚拟机…

养老实训室中,智能化养老服务平台的建设价值与措施

一、引言 随着人口老龄化的加速,对养老服务的需求日益攀升,传统的养老模式已无法满足现代社会的需求。智能化养老服务平台作为一种新兴的养老模式,以其高效、便捷和个性化的服务特点,开始受到社会的广泛关注。本文将深入探讨智能…

Linux:基本开发工具

一:编辑器vim 1.1vim的基本概念 vim其实有多重模式,这里我们主要了解vim的三种模式,分别是命令模式(command mode),插入模式(Insert mode)和底行模式(lst line mode) 正常/普通/命令模式(Normal mode) …

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型?五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题,如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过,是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态,与静态的数据集(比如说我自己的工作)不同,因此…

【Android】轮播图——Banner

引言 Banner轮播图是一种在网页和移动应用界面设计中常见的元素,主要用于在一个固定的区域内自动或手动切换一系列图片,以展示不同的内容或信息。这个控件在软件当中经常看到,商品促销、热门歌单、头像新闻等等。它不同于ViewPgaer在于无需手…

容器化技术入门:Docker详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 容器化技术入门:Docker详解 容器化技术入门:Docker详解 容器化技术入门:Docker详解 引言 Doc…

AssertionError: weight model.layers.0.self_attn.q_proj.weight does not exist

通义千问2.5-7B-Instruct-AWQ量化,但在npu上运行报上面错误,奇怪?: Exception:weight model.layers.0.self_attn.q_proj.weight does not exist AssertionError: weight model.layers.0.self_attn.q_proj.weight does not exist https://…