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

目录

  • 关于
  • [1 神经元模型](#1 神经元模型)
  • [2 感知机与多层网络](#2 感知机与多层网络)
  • [3 误差逆传播算法](#3 误差逆传播算法)
  • [4 全局最小与局部极小](#4 全局最小与局部极小)
  • [5 其他常见神经网络](#5 其他常见神经网络)
  • [6 深度学习](#6 深度学习)
  • [X 案例代码](#X 案例代码)
    • [X.1 源码](#X.1 源码)
    • [X.2 数据集(加州房价数据)](#X.2 数据集(加州房价数据))
    • [X.3 模型效果](#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=−η∂w∂E其中 η \eta η是学习率, E E E 是误差函数。
  • BP算法核心流程:

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

python 复制代码
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 模型效果






相关推荐
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书2 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·3 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼5 小时前
Python 神经网络项目常用语法
python
秀儿还能再秀5 小时前
神经网络(系统性学习三):多层感知机(MLP)
神经网络·学习笔记·mlp·多层感知机
一念之坤6 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl7812277 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder7 小时前
Python入门(12)--数据处理
开发语言·python
老艾的AI世界7 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK221517 小时前
机器学习系列----关联分析
人工智能·机器学习