机器学习基础06

目录

1.梯度下降

1.1梯度下降概念

1.2梯度下降公式

1.3学习率

1.4实现梯度下降

1.5API

1.5.1随机梯度下降SGD 

1.5.2小批量梯度下降MBGD

1.6梯度下降优化

2.欠拟合过拟合

2.1欠拟合

2.2过拟合

2.3正则化

2.3.1L1正则项(曼哈顿距离)

2.3.2L2正则项(欧氏距离 )


1.梯度下降

1.1梯度下降概念

正规方程求解的缺点

①利用正规方程求解的W是最优解的原因是MSE这个损失函数是凸函数。但机器学习的损失函数并非都是凸函数,设置导数为0会得到很多个极值,不能确定唯一解。

②当数据量和特征较多时,矩阵计算量太大.

在机器学习中,梯度表示损失函数对于模型参数的偏导数。具体来说,对于每个可训练参数,梯度告诉我们在当前参数值下,沿着每个参数方向变化时,损失函数的变化率。通过计算损失函数对参数的梯度,梯度下降算法能够根据梯度的信息来调整参数,朝着减少损失的方向更新模型。

1.2梯度下降公式

有损失函数:

梯度下降公式:

 得:

1.3学习率

设置大的学习率α;每次调整的幅度就大,设置小的学习率α;每次调整的幅度就小

 

(1)常见的设定数值:0.1、0.01、0.001、0.0001

(2)随着迭代次数增多学习率逐渐变小,深度学习的优化算法可以调整学习率

1.4实现梯度下降

import matplotlib.pyplot as plt
import numpy as np# 随机初始化
w= np.random.randint(-10,10,1)
# 学习率
h =0.01
# 收敛条件
diff=0.0001
# 最大更新的次数
time =1000lt_w =[]
lt_w_new=[]
for i in range(time):# 保存原w,用于计算差值w_new= wlt_w.append(w_new)lt_w_new.append(10*w**2-15.9*w+6.5)# 更新ww= w - h*(20*w_new-15.9)#20*w-15.9是切线difference=w_new-wprint(f'第{i+1}次迭代:','\t','w:',w,'\t','w_new-w:', difference)if abs(difference) <=diff:break# 图像示意,散点图为梯度下降
plt.scatter(lt_w,lt_w_new,c='red')w = np.linspace(-10,10,100)
loss = 10*w**2-15.9*w+6.5
# 曲线图为损失函数
plt.plot(w,loss)plt.show()

import numpy as np
import matplotlib.pyplot as plt# 随机初始化
w1 = 10
w2 = 10# 学习率
h = 0.001
# 收敛条件
diff = 0.0001
# 最大更新的次数
time = 1000def loss(w1, w2):return 4*w1**2 + 9*w2**2 + 2*w1*w2 + 3.5*w1 - 4*w2 + 6def dloss_w1(w1, w2):return 8*w1 + 2*w2 + 3.5def dloss_w2(w1, w2):return 2*w1 + 18*w2 - 4# 记录每次迭代的w1和w2
w1_history = [w1]
w2_history = [w2]for i in range(time):# 保存原w,用于计算差值w1_new = w1w2_new = w2# 更新ww1 = w1 - h * dloss_w1(w1_new, w2_new)w2 = w2 - h * dloss_w2(w1_new, w2_new)difference1 = w1_new - w1difference2 = w2_new - w2print(f'第{i+1}次迭代:\tw1: {w1:.6f}, w2: {w2:.6f}, w1_new-w1: {difference1:.6f}, w2_new-w2: {difference2:.6f}')# 记录每次迭代的w1和w2w1_history.append(w1)w2_history.append(w2)if abs(difference1) <= diff and abs(difference2) <= diff:breakprint("最终结果:w1 =", w1, "w2 =", w2)# 绘制三维图
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')# 创建网格数据
w1_vals = np.linspace(-15, 15, 100)
w2_vals = np.linspace(-15, 15, 100)
w1_grid, w2_grid = np.meshgrid(w1_vals, w2_vals)
loss_grid = loss(w1_grid, w2_grid)# 绘制损失函数的表面
ax.plot_surface(w1_grid, w2_grid, loss_grid, cmap='viridis', alpha=0.7)# 绘制梯度下降路径
ax.plot(w1_history, w2_history, [loss(w1, w2) for w1, w2 in zip(w1_history, w2_history)], color='r', marker='.')# 设置标签
ax.set_xlabel('w1')
ax.set_ylabel('w2')
ax.set_zlabel('Loss')# 显示图形
plt.show()

 

1.5API

批量梯度下降BGD(Batch Gradient Descent)

小批量梯度下降MBGD(Mini-BatchGradient Descent)

随机梯度下降SGD(Stochastic Gradient Descent)。

  • Batch Gradient Descent (BGD):每一次迭代都会使用全部的训练样本计算梯度来更新权重。这意味着每一步梯度更新都是基于整个数据集的平均梯度。这种方法的优点是每次更新的方向是最准确的,但缺点是计算量大且速度慢,尤其是在大数据集上。

  • Mini-Batch Gradient Descent (MBGD): 这种方法介于批量梯度下降和随机梯度下降之间。它不是用全部样本也不是只用一个样本,而是每次迭代从数据集中随机抽取一小部分样本(例如,从500个样本中选取32个),然后基于这一小批样本的平均梯度来更新权重。这种方法在准确性和计算效率之间取得了一个平衡。

  • Stochastic Gradient Descent (SGD): 在随机梯度下降中,每次迭代仅使用随机单个样本(或有时称为“例子”)来计算梯度并更新权重。这种方法能够更快地收敛,但由于每次更新都基于单个样本,所以会导致权重更新路径不稳定。

1.5.1随机梯度下降SGD 

sklearn.linear_model.SGDRegressor()

参数:
    loss: 损失函数,默认为 ’squared_error’
    fit_intercept: 是否计算偏置, default=True
    eta0: float, default=0.01学习率初始值
    learning_rate:  str, default=’invscaling’   
            ‘constant’: eta = eta0 学习率为eta0设置的值,保持不变
            ‘optimal’: eta = 1.0 / (alpha * (t + t0)) 
            ‘invscaling’: eta = eta0 / pow(t, power_t)
            ‘adaptive’: eta = eta0, 学习率由eta0开始,逐步变小
    max_iter: int,  default=1000 经过训练数据的最大次数(又名epoch)
    shuffle=True 每批次是否洗牌
    penalty: {‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’,要使用的正则化项
属性:     
      coef_ 回归后的权重系数
      intercept_ 偏置 

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_errordataset = fetch_california_housing(data_home='./src')x_train,x_test,y_train,y_test=train_test_split(dataset.data,dataset.target,train_size =0.7,shuffle =True,random_state=200)transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)# 线性回归预估器
estimator = SGDRegressor(loss='squared_error',penalty='l1',max_iter=1000,eta0=0.01,learning_rate ='constant')
estimator.fit(x_train,y_train)# 模型数据
print('coef:',estimator.coef_)
print('intercept:',estimator.intercept_)y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
print('决定系数 (R^2):',estimator.score(x_test,y_test))
error = mean_squared_error(y_test,y_predict)
print('均方误差:',error)

1.5.2小批量梯度下降MBGD

sklearn.linear_model.SGDRegressor()

 调用partial_fit函数训练直接更新权重,不需要调fit从头开始训练。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_errordataset = fetch_california_housing(data_home='./src')x_train,x_test,y_train,y_test=train_test_split(dataset.data,dataset.target,train_size =0.7,shuffle =True,random_state=200)transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)# 线性回归预估器
estimator = SGDRegressor(loss='squared_error',penalty='l1',max_iter=1000,eta0=0.01,learning_rate ='constant')# 小批量梯度下降
batch_size =50 # 批量大小
n_batches = len(x_train)//batch_size 
for epoch in range(estimator.max_iter):# 随机打乱样本顺序indices = np.random.permutation(len(x_train))for i in range(n_batches):start_index = i*batch_sizeend_index = (i+1) * batch_sizebatch_indices = indices[start_index:end_index]x_batch = x_train[batch_indices]y_batch = y_train[batch_indices]# 更换模型权重estimator.partial_fit(x_batch,y_batch) # 模型数据
print('coef:',estimator.coef_)
print('intercept:',estimator.intercept_)y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
print('决定系数 (R^2):',estimator.score(x_test,y_test))
error = mean_squared_error(y_test,y_predict)
print('均方误差:',error)

1.6梯度下降优化

(1)标准化

(2)正则化

2.欠拟合过拟合

分类问题的三种拟合状态:

回归问题的三种拟合状态:

2.1欠拟合

欠拟合是指模型在训练数据上表现不佳,同时在其他数据上也表现不佳。这通常发生在模型过于简单,无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下:

  • 训练误差较高。

  • 测试误差同样较高。

  • 模型可能过于简化,不能充分学习训练数据中的模式。

2.2过拟合

过拟合是指模型在训练数据上表现得非常好,但在其他数据上表现较差。这通常发生在模型过于复杂,以至于它不仅学习了数据中的真实模式,还学习了噪声和异常值。过拟合模型的表现特征如下:

  • 训练误差非常低。

  • 测试误差较高。

  • 模型可能过于复杂,以至于它对训练数据进行了过度拟合。

2.3正则化

正则化的意义:防止过拟合,增加模型的鲁棒性。

正则化:将原来的损失函数加上一个惩罚项使得计算出来的模型w相对小一些。

常用的惩罚项有L1正则项或者L2正则项:

2.3.1L1正则项(曼哈顿距离)

2.3.2L2正则项(欧氏距离 )

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

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

相关文章

【系统设计】设计一个系统时,需要考虑的关键因素

一、需求分析 明确目标和业务需求 与利益相关者&#xff08;如客户、用户、管理层等&#xff09;进行充分沟通&#xff0c;了解系统要解决的具体问题和期望达成的目标。 例如&#xff0c;设计一个电子商务系统&#xff0c;需要明确支持的业务流程&#xff0c;如商品展示、购物…

可认证数据资产合约标准协议(CMIDA-1)意见征集

标准背景 数据资产具备多维度的属性&#xff0c;涵盖行业特性、状态信息、资产类型、存储格式等。数据资产在不同流通主体之间可理解、可流通、可追溯、可信任的重要前提之一是存在统一的标准&#xff0c;缺失统一的标准&#xff0c;数据混乱冲突、一数多源、多样多类等问题将…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍

文章目录 1. Dolby TrueHD特点总结 2. Dolby Digital Plus (E-AC-3)特点总结 Dolby TrueHD 与 Dolby Digital Plus (E-AC-3) 的对比 Dolby TrueHD和Dolby Digital Plus (E-AC-3) 是两种高级的杜比音频编码格式&#xff0c;常用于蓝光影碟、流媒体、影院等高品质音频传输场景。它…

Docker-01

Docker用于构建、打包、分发和运行应用程序。它允许开发人员将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后可以在任何支持Docker的环境中运行这个容器。 Linux systemctl start docker //启动dockersystemctl stop docker //停止dockersystemctl enable d…

【.net core】【sqlsugar】字符串拼接+内容去重

假设有成绩类&#xff0c;字段如下 //成绩类 public class Score{public int id{get;set;}//学号public string No{get;set;}//学科public string subject{get;set;}//成绩public string score{get;set;} }需要实现数据汇总&#xff0c;汇总要求&#xff1a;结果中每行只展示单…

算法——删除链表的倒数第N个节点(leetcode19)

对于这道题我首先想到的是双指针并且也正确解答了后发现其实我写的代码冗余了依然可以优化代码为单指针即可解题但看了题解之后发现快慢指针非常巧妙代码也非常简洁 单指针解法 1、定义一个虚拟节点vNode指向头结点 2、定义指针cur指向虚拟节点vNode 3、遍历链表得到链表的…

Python Pillow图像编辑

Pillow简介 Pillow 不仅是 PIL 库的“复制版”&#xff0c;而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今&#xff0c;已经成为了比 PIL 更具活力的图像处理库。 Pillow 的初衷只是想作为 PIL 库的分支和补充&#xff0c;如今它已是“青出于蓝而胜于蓝”。 …

爬虫开发(1)爬虫开发工具介绍与环境搭建

在数据驱动的时代&#xff0c;网络爬虫成为了获取大量数据的重要手段。无论是市场调研、竞争对手分析还是学术研究&#xff0c;爬虫都能帮助我们高效地收集和处理信息&#xff0c;所以你还不抓紧学习爬虫嘛&#xff1f; 在本文中&#xff0c;博主将详细介绍如何搭建爬虫开发环境…

1+X应急响应(网络)系统信息收集分析:

系统信息收集分析&#xff1a; 系统启动项和计划任务分析&#xff1a; 系统进程&#xff0c;服务分析&#xff1a; 内存取证&#xff1a; 系统崩溃转储&#xff1a;

Python基础学习-09文件操作

目录 1、常见文件操作 2、常见文件函数 3、文件中存储并解析Python对象 4、本节总结 1、常见文件操作 • 常见文件操作 1&#xff09; fileopen(file_path) #默认modert 2&#xff09; fileopen(file_path, “r”) 3&#xff09; fileopen(file_path, encodin…

《人工智能深度学习的基本路线图》

《人工智能深度学习的基本路线图》 基础准备阶段 数学基础&#xff1a; 线性代数&#xff1a;深度学习中大量涉及矩阵运算、向量空间等概念&#xff0c;线性代数是理解和处理这些的基础。例如&#xff0c;神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…

找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法

当计算机系统中无法找到vcruntime140.dll这个特定的动态链接库文件时&#xff0c;可能会引发一系列运行问题&#xff0c;具体表现形式多样且影响范围较广。对于依赖于该文件运行的各类软件应用来说&#xff0c;缺失vcruntime140.dll将直接导致程序无法正常启动或执行&#xff0…

Redis学习 ——缓存

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis&#xff0c;但是如果涉及到了比较…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

视觉SLAM--经典视觉SLAM框架

整个视觉SLAM流程主要包括以下步骤&#xff1a; 1、传感器信息读取&#xff1a;在视觉SLAM中主要为相机图像信息的读取和预处理。 2、前端视觉里程计&#xff1a;估算相邻图像间相机的运动&#xff0c;以及局部地图的样子。 3、后端&#xff08;非线性&#xff09;优化&#…

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…

Ajax的相关内容

一、Ajax的使用步骤 1.创建XML对象 const xhrnew XMLHttpRequest(); 2.监听事件&#xff0c;处理响应 3.准备发送请求 true表示异步 ajax中永远是异步&#xff0c;永远是true 4.发送请求 二、GET和POST请求 三、JSON的三种形式 四、JSON的方法 五、跨域 六、XHR的属性和方法…

有限状态机(续)

一、添加刀光和场景 1、资源链接&#xff1a; 武器刀光&#xff1a;https://assetstore.unity.com/packages/tools/particles-effects/melee-weapon-trail-1728 场景&#xff1a;https://assetstore.unity.com/packages/3d/environments/fantasy/casual-tiny-environment-ju…

【日常记录-Git】撤销工作区中所有已跟踪文件的修改

1. 简介 在Git中&#xff0c;若想恢复工作区中的所有文件到它们最后一次提交时的状态&#xff0c;可以使用 git restore 命令结合适当的选项来实现。不过&#xff0c;需要注意的是&#xff0c;git restore 默认不会递归地恢复目录&#xff0c;但你可以通过指定 . (代表当前目…