机器学习(四)——神经网络(神经元、感知机、BP神经网络、梯度下降、多层神经网络、Python源码)

目录

  • 关于
  • 1 神经元模型
  • 2 感知机与多层网络
  • 3 误差逆传播算法
  • 4 全局最小与局部极小
  • 5 其他常见神经网络
  • 6 深度学习
  • X 案例代码
    • X.1 源码
    • X.2 数据集(加州房价数据)
    • X.3 模型效果


关于

  • 本文是基于西瓜书(第五章)的学习记录。内容包括神经元模型、激活函数、感知机、BP算法下的前馈神经网络、参数调优方法、其他常见的神经网络、深度学习、Python实现源码。
  • 西瓜书电子版:百度网盘分享链接

1 神经元模型

  • 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应”

  • 神经网络中最基本的成分是神经元模型,即上述定义中的“简单单元”

  • M-P神经元模型:由McCulloch和Pitts在1943年提出,是至今仍被广泛使用的模型。在这个模型中,神经元接收来自其他神经元的输入信号,这些信号通过带权重的连接传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过激活函数f处理以产生神经元的输出。
    在这里插入图片描述

  • 激活函数:理想中的激活函数是阶跃函数,它将输入值映射为输出值“0”或“1”。然而,由于阶跃函数的不连续性,实际中常用Sigmoid函数作为激活函数,它将输入值挤压到(0,1)输出值范围内。
    在这里插入图片描述

2 感知机与多层网络

  • 感知机:由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元。感知机能实现逻辑与、或、非运算,并且可以通过学习得到权重和阈值。

  • 阈值可看作一个固定输入为-1.0的“哑结点”,这样权重和阈值的学习就可统一为权重的学习

  • 感知机的学习过程:

    • 预测正确:参数不发生变化
    • 预测失败:
      在这里插入图片描述
      其中 η η η称为学习率,学习率太小会导致学习收敛速度缓慢,太大会容易振荡,有时为了精细调节可以在每一层设置不同的学习率。
  • 感知机的结构示意图:
    在这里插入图片描述

  • 多层网络:为了解决非线性可分问题,需要使用多层功能神经元。

  • 关于是否线性可分:

    • 线性可分:存在一个线性超平面能将两种模式分开,如下图a,b,c。d需要两个超平面,所以不是线性可分的。
      在这里插入图片描述
  • 隐层/隐含层:输入层和输出层之间的神经元,隐含层和输出层神经元都是拥有激活函数的功能神经元

  • 常见的神经网络:多层前馈神经网络——每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接
    在这里插入图片描述

  • 不同层神经元的作用:

    • 输入层:接收外界输入
    • 隐层:对信号加工
    • 输出层:对信号加工、输出结果
  • 神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值;换言之,神经网络 “学”到的东西,蕴涵在连接权与阈值中

3 误差逆传播算法

  • BP网络:一般指BP算法训练的多层前馈神经网络

  • BP算法

    • 误差逆传播算法(BackPropagation,简称BP)是训练多层网络的最成功算法之一。
    • 它基于梯度下降策略,通过计算误差函数的负梯度来更新参数: Δ w = − η ∂ E ∂ w \Delta w = -\eta \frac{\partial E}{\partial w} Δw=ηwE其中 η \eta η是学习率, E E E 是误差函数。
  • BP算法核心流程:

    1. 先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果
    2. 然后计算输出层的误差,再将误差逆向传播至隐层神经元
    3. 最后根据隐层神经元的误差来对连接权和阈值进行调整
    4. 该迭代过程循环进行,直到达到某些停止条件为止,例如训练误差已达到一个较小水平
  • BP算法伪代码:
    - BP算法伪代码:

  • 关于标准BP算法和累积BP算法:

    • 标准BP算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象.
    • 累积BP算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新,
    • 但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准B P往往会更快获得较好的解
  • 过拟合的处理:

    • 早停:若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值作为训练结果
    • 正则化:在误差目标函数中增加一个用于描述网络复杂度的部分

4 全局最小与局部极小

  • 示意图
    在这里插入图片描述

  • BP算法的每次迭代中,我们先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向(更改权值),这容易导致进入局部最小(我们希望全局最小)。

  • 跳出局部最小的解决方法(启发式,无理论保障):

    • 多组初始参数值:以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数
    • 模拟退火算法:模拟退火在每一轮迭代都以一定的概率接受比当前解更差的结果,从而有助于 “跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定.
    • 随机梯度下降:在计算梯度时加入了随机因素
    • 遗传算法

5 其他常见神经网络

  • RBF网络:径向基函数网络

    • 使用径向基函数作为隐层神经元激活函数,输出层是对隐层神经元输出的线性组合
    • 训练
      • 第一步,确定神经元中心,常用的方式包括随机采样、聚类等;
      • 第二步,利用BP算法等来确定参数
  • ART网络:自适应谐理论网络

    • 竞争型学习:是一种无监督学习策略,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元的状态被抑制
    • ART网络由比较层、识别层、识别阈值和重置模块构成,能够进行增量学习。
  • SOM网络:自组织映射网络

    • 能够将高维输入数据映射到低维空间,同时保持输入数据在高维空间的拓扑结构。
  • 级联相关网络:结构自适应网络

    • 训练过程中新的隐层神经元逐渐加入,从而创建起层级结构。
    • 级联相关网络无需设置网络层数、隐层神经元数目,且训练速度较快,但其在数据较小时易陷入过拟合
  • Elman网络:递归神经网络

    • 允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号
  • Boltzmann机:基于能量的模型,神经元分为两层:显层与隐层,训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。

6 深度学习

  • 深度学习模型:典型的深度学习模型就是很深层的神经网络,通过增加隐层的数目来提高模型的容量。

  • 多隐层神经网络难以直接用经典算法(例如标准BP算法)进行训练,因为误差在多隐层内逆传播时,往往会“发散 "(diverge)而不能收敛到稳定状态.

  • 可行的训练方法:

    • 无监督逐层训练:是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为“预训练 " ;在预训练全部完成后,再对整个网络进行“微调”训练,如利用BP算法对整个网络微调。其思想是:将大量参数分组,对每组先找到局部看来比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优
    • 权共享:让一组神经元使用相同的连接权
  • 深度学习的思想:特征学习:深度学习可以看作是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化为与输出目标联系更密切的表示。换言之,通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示后,用 “简单模型”即可完成复杂的分类等学习任务

X 案例代码

X.1 源码

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.metrics import mean_squared_error, r2_score# 1. 加载数据集
data = fetch_california_housing()
X, y = data.data, data.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 4. 构建并训练BP神经网络模型
# 包含两个隐藏层,每层包含64个神经元,激活函数为ReLU
model = Sequential([Dense(64, activation='relu'),Dense(64, activation='relu'),Dense(1)  # 输出层
])# 编译模型,使用Adam优化器用于优化调整网络权重,均方误差作为损失函数,并添加MAE作为评估指标
model.compile(optimizer='adam', loss='mse', metrics=['mae'])# 训练模型
# 训练50个epoch,每次使用32个样本进行训练,使用验证集评估模型
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)# 5. 预测测试集上的目标变量
y_pred = model.predict(X_test).flatten()# 6. 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print("BP神经网络模型性能:")
print(f"Mean Squared Error: {mse:.2f}")
print(f"R^2 Score: {r2:.2f}", '\n')# 6. 绘制实际值和预测值的折线图
plt.figure(figsize=(12, 6))
plt.plot(y_test[:50], label='Actual', marker='o', color='blue')
plt.plot(y_pred[:50], label='Predicted', marker='x', color='red', linestyle='--')
plt.title('Actual vs Predicted Values for California Housing Dataset (50 Samples)')
plt.xlabel('Sample Index')
plt.ylabel('Target Value')
plt.legend()
plt.tight_layout()
plt.show()# 8. 保存模型为HDF5文件
model.save('neural_network_model.h5')# 可选:查看模型的训练历史
print("模型训练历史:")
pd.DataFrame(history.history).plot(figsize=(10, 6))
plt.xlabel('Epochs')
plt.ylabel('Value')
plt.title('Training and Validation Loss and Mean Absolute Error')
plt.grid(True)
plt.tight_layout()
plt.show()# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})# 可选,查看模型的结构、优化器、损失函数、评估指标、输入形状、输出形状、参数等
print("模型预测结果:")
print(results)
print("模型结构:")
print(model.summary())
print("模型优化器:")
print(model.optimizer)
print("模型损失函数:")
print(model.loss)
print("模型评估指标:")
print(model.metrics)
print("模型输入形状:")
print(model.input_shape)
print("模型输出形状:")
print(model.output_shape)
print("模型参数:")
print(model.get_weights())

X.2 数据集(加州房价数据)

  • 加州房价数据集是机器学习领域中常用的数据集之一,常被用于回归算法的测试和演示。

  • 概览

    • 样本数量:20640个样本
    • 特征数量:8个特征
    • 标签:1个连续的目标变量
  • 特征描述

    • MedInc (Median Income in block group):区块组的中位数收入,单位为10,000美元。
    • HouseAge (Median House Age in block group):区块组中房屋的中位数年龄,单位为年。
    • AveRooms (Average number of rooms per household):每个家庭的平均房间数。
    • AveBedrms (Average number of bedrooms per household):每个家庭的平均卧室数。
    • Population (Block group population):区块组的人口数。
    • AveOccup (Average house occupancy):每个房屋的平均居住人数。
    • Latitude (Block group latitude):区块组的纬度。
    • Longitude (Block group longitude):区块组的经度。
  • 目标变量

    • MedHouseVal (Median house value for households in block group):区块组中房屋的中位数价值,单位为100,000美元。
  • 使用

    • 可以使用 sklearn.datasets.fetch_california_housing() 函数来加载这个数据集,并查看其详细信息。

X.3 模型效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Diving into the STM32 HAL-----Clock Tree笔记

几乎每个数字电路都需要一种方法来同步其内部电路或与其他电路同步。时钟是一种产生周期性信号的设备,它是数字电子学中最普遍的心跳源形式。 然而,相同的时钟信号不能用于馈送现代微控制器(如 STM32 微控制器)提供的所有组件和外…

每日科技资讯:2024年11月06日【龙】农历十月初六 ---文末送书

目录 1.OpenAI因算力瓶颈暂缓GPT-5发布 合作芯片开发寻求突破2.现在,𝕏 允许被你屏蔽的人继续查看你的帖子3.硬刚Intel与AMD!NVIDIA明年推出PC芯片4.苹果停止签署 iOS 18.0.1,不再允许从 18.1 降级5.Nvidia 加入道琼斯指数成份股 …

高效率的快捷回复软件 —— 客服宝聊天助手

在电商行业日益繁荣的今天,高效的客户沟通对于企业的成功至关重要。无论是电商平台、居家客服还是其他各类客服行业,都需要一款强大的工具来提升工作效率。今天,我们就来介绍一款高效率的快捷回复软件 —— 客服宝聊天助手。 一、跨平台跨店铺…

RabbitMQ如何保证发送的消息可靠(RabbitMQ的Confirm模式和2.Return模式)

RabbitMQ如何保证发送的消息可靠(RabbitMQ的Confirm模式和2.Return模式) 1、RabbitMQ消息Confirm模式(保证从生产者到交换机的消息可靠)1.1、Confirm模式简介1.2、具体代码实现1.2.1、application.yml 开启确认模式1.2.2、生产者方…

讲讲分布式事务?

大家好,我是锋哥。今天分享关于【讲讲分布式事务?】面试题。希望对大家有帮助; 讲讲分布式事务? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在现代的分布式系统中,数据往往分布在不同的服务器、数据中…

【职场日常】软件测试平台如何搭建?

作为一名软件测试工程师,搭建测试环境是我们日常工作的一部分。搭建一个适合各类测试的测试环境至关重要,可以在后期的测试过程中为我们提供便利。接下来我将向大家介绍如何搭建测试环境,以及需要注意的事项。 首先,我们需要确保…

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…

3D一览通更新三大功能更新,进一步提升协同效率

大腾智能3D一览通新功能正式发布!本次新版本在通用功能的基础上,新增并优化了3大功能点,为用户带来更加流畅、高效的使用体验,提升设计协同效率。 功能点1:在结构树中管理测量标注对象 在新版本中,我们将…

基于DCT的数字水印算法

摘要 数字水印技术近年来得到了较大的发展,基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性,把标识版权的水印信息嵌入到数字作品中,从而可以起到保护数字作品的版权或其完整性的一种技术。 一个…

JAVA——反射

目录 1.概述 2.Class类 a.实例化对象 1.利用Class类的静态方法 2. 利用类名 3.利用类的成员方法 b.常见方法 1.获取所有公共构造方法对象的数组 2.获取所有构造方法对象数组 3.获取单个公共构造方法对象 4.获取单个构造方法对象 5.获取所有公共成员变量对象的数组 …

CMDB模型管理:构筑高效IT运维的坚实基础

在CMDB中,模型是一个非常重要的概念,在前面的文章中我们提到了模型对于保障CMDB数据准确性的重要性。那么,要如何理解CMDB的模型呢?模型在CMDB中又是什么地位?能起到什么作用呢? 一、模型概述 在CMDB中&…

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今,若选一只股票长期持有,最佳解是 ARM(涨了 20 倍),因为无论系统层和应用层谁胜出,底层一定是芯片,而…

实现金蝶和简道云仓库数据的高效集成

实现金蝶和简道云仓库数据的高效集成 金蝶-仓库--->简道云-仓库:高效数据集成方案 在企业信息化管理中,数据的高效流转和实时监控是提升业务效率的关键。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将金蝶云星空…

Redis - Hash 哈希

一、基本认识 ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数 组、映射。在Redis中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如key"key",value{{ field1, v…

基于python的简单web服务器示例

安装flask flask 简介:是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目 新建项目 创建好的效果 pip list 检索 安装…

职场日常:多年的测试工程师如何继续在测试行业中砥砺前行

大家好,今天我们一起聊聊测试工程师在职业、在团队、在家庭中如何更好的做好角色。 作为一个工作了多年测试工作的大牛来说,从今天开始或许未来会因为各个方面的原因可能不在从事软件测试了,但是会继续总结过往的经验,从事这么多…

【图神经网络】 AM-GCN代码实战(4)【pytorch】代码可运行

AM-GCN 网络系列 代码实践部分1. dataprocess.py1.1 模块导入1.2 特征文件生成1.3 KNN构图 2. configparser.py3. layers.py4. models.py5. utils.py6. main.py总结 代码实践部分 本专栏致力于深入探讨图神经网络模型相关的学术论文,并通过具体的编程实验来深化理解…

「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现

本篇将带领你实现一个实用的计时器应用,用户可以启动、暂停或重置计时器。该项目将涉及时间控制、状态管理以及按钮交互,是掌握鸿蒙应用开发的重要步骤。 关键词 UI互动应用时间控制状态管理用户交互 一、功能说明 在这个计时器应用中,用户…

条件logistic回归原理及案例分析

前面介绍的二元、多分类、有序Logistic回归都属于非条件Logistic回归,每个个案均是相互独立关系。在实际研究中,还有另外一种情况,即个案间存在配对关系,比如医学研究中配对设计的病例对照研究,此时违反了个案相互独立…

LeetCode:1.两数之和——Java 暴力解法哈希表

目录 题目如下: ​编辑 方法一:暴力解法 方法二:哈希表解法 题目如下: 1. 两数之和https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 tar…