BP神经网络(公式推导+举例应用)

文章目录

      • 引言
      • M-P神经元模型
      • 激活函数
      • 多层前馈神经网络
      • 误差逆传播算法
      • 缓解过拟合化
      • 结论
      • 实验分析

引言

人工神经网络(Artificial Neural Networks,ANNs)作为一种模拟生物神经系统的计算模型,在模式识别、数据挖掘、图像处理等领域取得了显著的成功。其中,BP神经网络(Backpropagation Neural Network,BPNN)作为一种常见的前馈式神经网络,以其在模式学习和逼近函数方面的优越性受到广泛关注。BP神经网络不仅能够处理非线性关系,还能够通过训练不断调整网络参数,实现对复杂模型的逼近,具有较强的自适应性和泛化能力。

本文旨在深入探讨BP神经网络的基本原理和数学模型,通过对其公式的详细推导,为读者提供清晰的理论基础。此外,通过具体的举例应用,展示BP神经网络在实际问题中的有效性和应用前景。通过对BP神经网络的深入理解,我们可以更好地应用和优化该模型,推动人工智能领域的发展。

在神经网络研究的历史长河中,BP神经网络无疑是一个重要的里程碑,其不断演化和改进为解决实际问题提供了有力的工具。通过深入研究BP神经网络,我们有望更好地理解神经网络的内在机理,推动其在各个领域的广泛应用。在人工智能日益发展的今天,BP神经网络仍然是一个备受关注的研究方向,本文将为读者提供对其深入理解的途径和启发。

M-P神经元模型

在生物神经网络中,每个神经元与其他神经元相连接,当它“兴奋”时,就会向相连接的神经元发送化学物质,从而改变这些神经元内的电位;若某神经元的电位超过一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。我们将上述所描述的情形抽象为下图所示(M-P神经元模型):
在这里插入图片描述
在这个模型中,神经元接受到来自 n n n个其他神经元传递过来的输入信号,这些输入信号通过带权的连接进行传递,神经元接受到的总输入值与神经元的阈值进行对比,然后通过”激活函数“处理以产生神经元的输出。

激活函数

理想中的激活函数如下图所示:
在这里插入图片描述
s g n ( x ) = { 1 , x ≥ 0 0 , x < 0 sgn(x)= \begin{cases} 1,\quad x\geq 0\\ 0, \quad x<0 \end{cases} sgn(x)={1,x00,x<0
显然“1”对应神经元兴奋、“0”对应神经元抑制。然而 s g n ( x ) sgn(x) sgn(x)数学性质不好,不具备连续性且不光滑。因此实际上我们采用 s i g m o i d sigmoid sigmoid函数作为激活函数,典型的 s i g m o i d sigmoid sigmoid函数如下图所示:
在这里插入图片描述
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\frac{1}{1+e^{-x}} sigmoid(x)=1+ex1
然后将许多的神经元按一定的层次连接起来,就构成了一个神经网络。

多层前馈神经网络

常见的神经网络是形如下图所示的层级结构:
在这里插入图片描述
每层神经元与下一层神经元全连接,神经元之间不存在同层连接,也不存在跨层连接。这样的网络称为多层前馈神经网络。

误差逆传播算法

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } D=\{ (x_1,y_1),(x_2,y_2),...(x_m,y_m)\} D={(x1,y1),(x2,y2),...(xm,ym)} x i ∈ ℜ d , y i ∈ ℜ l x_i\in \Re^d,y_i \in \Re^l xid,yil,即输入样例由 d d d个属性描述,输出样例由 l l l维实值向量。下图给出一个拥有 d d d个输入神经元、 l l l个输出神经元、 q q q个隐层神经元的多层前反馈神经网络。其中输出层第 j j j个神经元的阈值用 θ j \theta_j θj表示,隐层第 h h h个神经元的阈值用 γ h \gamma_h γh表示。输入层第 i i i个神经元与隐层第 h h h个神经元之间的连接权为 v i h v_{ih} vih,隐层第 h h h个神经元与输出层第 j j j个神经元之间的连接权为 w h j w_{hj} whj。记隐层第 h h h个神经元接收到的输入为 α h = ∑ i = 1 d v i h x i \alpha_h=\sum_{i=1}^dv_{ih}x_i αh=i=1dvihxi,输出层第 j j j个神经元接收到的输入为 β j = ∑ h = 1 q w h j b h \beta_j=\sum_{h=1}^qw_{hj}b_h βj=h=1qwhjbh。其中 b h b_h bh为隐层第 h h h个神经元的输出。
在这里插入图片描述
对训练集 ( x k , y k ) (x_k,y_k) (xk,yk),假定神经网络的输出为 y ^ j k = ( y ^ 1 k , y ^ 1 k , . . . , y ^ l k ) \hat y_j^k=(\hat y_1^k,\hat y_1^k,...,\hat y_l^k) y^jk=(y^1k,y^1k,...,y^lk)
y ^ j k = f ( β j − θ j ) (1) \hat y_j^k=f(\beta_j-\theta_j) \tag{1} y^jk=f(βjθj)(1)
则网络在 x k , y k x_k,y_k xk,yk上的均方误差为:
E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 (2) E_k=\frac{1}{2}\sum_{j=1}^l(\hat y_j^k-y_j^k)^2 \tag{2} Ek=21j=1l(y^jkyjk)2(2)
其中 y ^ j k \hat y_j^k y^jk为神经网络模型输出, y j k y_j^k yjk为训练集实际样例输出。

故在上图网络中共有 ( d + l + 1 ) q + l (d+l+1)q+l (d+l+1)q+l个参数。BP是一个迭代学习算法,在迭代的每一轮中采用广义感知机学习规则对参数进行更新估计,任意参数 v v v的更新估计式为:
v ← v + Δ v (3) v\leftarrow v+\Delta v \tag{3} vv+Δv(3)

以上图的BP网络中隐层到输出层的连接权 w h j w_{hj} whj为例来进行推导:
BP算法基于梯度下降法,以目标的负梯度方向对参数进行调整,对误差 E k E_k Ek,给定学习率 η \eta η,有:
Δ w h j = − η ∂ E k ∂ w h j (4) \Delta w_{hj}=-\eta \frac{\partial E_k}{\partial w_{hj}} \tag{4} Δwhj=ηwhjEk(4)
我们注意到 w h j w_{hj} whj先影响到第 j j j个输出层神经元的输入值 β j \beta_j βj,再影响到输出值 y ^ j k \hat y_j^k y^jk,最终影响到 E k E_k Ek,有:
∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j (5) \frac{\partial E_k}{\partial w_{hj}}=\frac{\partial E_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \beta_j}\cdot \frac{\partial \beta_j}{\partial w_{hj}} \tag{5} whjEk=y^jkEkβjy^jkwhjβj(5)

根据 β j = ∑ h = 1 q w h j h h \beta_j=\sum_{h=1}^qw_{hj}h_h βj=h=1qwhjhh的定义,显然有:
∂ β j ∂ w h j = b h (6) \frac{\partial \beta_j}{\partial w_{hj}}=b_h \tag{6} whjβj=bh(6)

又因为 s i g m o i d sigmoid sigmoid函数有一个很好的数学性质:
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) (7) f^\prime(x)=f(x)(1-f(x)) \tag{7} f(x)=f(x)(1f(x))(7)

根据式子(1)和(2),有:
g j = − ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j = − ( y ^ j k − y j k ) f ′ ( β j − θ j ) = y ^ j k ( 1 − y ^ j k ) ( y j k − y ^ j k ) (8) \begin{align*} g_j & = -\frac{\partial E_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \beta_j} \\ & = -(\hat y_j^k-y_j^k)f^\prime(\beta_j-\theta_j) \\ & = \hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k) \end{align*} \tag{8} gj=y^jkEkβjy^jk=(y^jkyjk)f(βjθj)=y^jk(1y^jk)(yjky^jk)(8)
其中 E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 E_k=\frac{1}{2}\sum_{j=1}^l(\hat y_j^k-y_j^k)^2 Ek=21j=1l(y^jkyjk)2,那么 ∂ E k ∂ y ^ j k = y ^ j k − y j k \frac{\partial E_k}{\partial \hat y_j^k}=\hat y_j^k-y_j^k y^jkEk=y^jkyjk y ^ j k = f ( β j − θ j ) \hat y_j^k=f(\beta_j-\theta_j) y^jk=f(βjθj),那么 ∂ y ^ j k ∂ β j = f ′ ( β j − θ j ) = f ( β j − θ j ) ⋅ ( 1 − f ( β j − θ j ) ) = y ^ j k ⋅ ( 1 − y ^ j k ) \frac{\partial \hat y_j^k}{\partial \beta_j}=f^\prime(\beta_j-\theta_j)=f(\beta_j-\theta_j)\cdot(1-f(\beta_j-\theta_j))=\hat y_j^k\cdot (1-\hat y_j^k) βjy^jk=f(βjθj)=f(βjθj)(1f(βjθj))=y^jk(1y^jk)

将(6)和(8)带入(5)中有:
∂ E k ∂ w h j = g j ⋅ b h (9) \frac{\partial E_k}{\partial w_{hj}}=g_j\cdot b_h \tag{9} whjEk=gjbh(9)

再将(9)带入(4)中,得到BP算法 中关于 w h j w_{hj} whj的更新公式:
Δ w h j = − η g j b h (10) \Delta w_{hj}=-\eta g_jb_h \tag{10} Δwhj=ηgjbh(10)

同理可得:
Δ θ j = − η g j (11) \Delta\theta_j=-\eta g_j \tag{11} Δθj=ηgj(11)
Δ v i h = η e h x i (12) \Delta v_{ih}=\eta e_hx_i \tag{12} Δvih=ηehxi(12)
Δ γ h = − η e h (13) \Delta \gamma_h=-\eta e_h \tag{13} Δγh=ηeh(13)
其中
e h = − ∂ E k ∂ b h ⋅ ∂ b h ∂ α h = − ∑ j = 1 l ∂ E k ∂ β j ⋅ ∂ β j ∂ b h f ′ ( α h − γ h ) = ∑ j = 1 l w h j g j f ′ ( α h − γ h ) = b h ( 1 − b h ) ∑ j = 1 l w h j g j (14) \begin{align*} e_h & = -\frac{\partial E_k}{\partial b_h}\cdot \frac{\partial b_h}{\partial \alpha_h} \\ & = -\sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j}\cdot\frac{\partial \beta_j}{\partial b_h}f^\prime(\alpha_h-\gamma_h) \\ & = \sum_{j=1}^lw_{hj}g_jf^\prime(\alpha_h-\gamma_h) \\ & = b_h(1-b_h)\sum_{j=1}^lw_{hj}g_j \end{align*} \tag{14} eh=bhEkαhbh=j=1lβjEkbhβjf(αhγh)=j=1lwhjgjf(αhγh)=bh(1bh)j=1lwhjgj(14)

其中 b h b_h bh是隐层神经元的输出 b h = f ( α h − γ h ) b_h=f(\alpha_h-\gamma_h) bh=f(αhγh) γ h \gamma_h γh是隐层神经元的阈值, α h \alpha_h αh是隐层神经元的输入。
直到所有参数调整至累计误差最小即:
E m i n = 1 m ∑ k = 1 m E k (15) E_{min}=\frac{1}{m}\sum_{k=1}^mE_k \tag{15} Emin=m1k=1mEk(15)

缓解过拟合化

由于BP神经网络强大的表示能力,BP神经网络经常遭遇过拟合化,其训练误差持续降低,但测试误差却可能上升。共有两种策略来缓解BP网络的过拟合化。

  • 早停:基本思想是在训练过程中监测验证集(一部分未参与训练的数据)上的性能,并在验证集性能达到最优时停止训练,而不是继续训练直到训练误差降为零。
  • 正则化:正则化通过修改损失函数,向优化过程中引入额外的惩罚项,从而限制模型的复杂性。这有助于防止神经网络对训练数据过度拟合。在神经网络中,L2(范数) 正则化的损失函数,则误差目标函数为:
    E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i w i 2 (16) E=\lambda\frac{1}{m}\sum_{k=1}^mE_k+(1-\lambda)\sum_{i}w_i^2 \tag{16} E=λm1k=1mEk+(1λ)iwi2(16)
    其中 λ ∈ ( 0 , 1 ) \lambda \in (0,1) λ(0,1),用来对经验风险和结构风险进行折中处理。其中经验风险为 1 m ∑ k = 1 m E k \frac{1}{m}\sum_{k=1}^mE_k m1k=1mEk,结构风险为 ∑ i w i 2 \sum_{i}w_i^2 iwi2

结论

在神经网络领域,BP神经网络是一种重要的前馈神经网络,以其在模式学习和逼近函数方面的优越性而备受关注。本文深入探讨了BP神经网络的基本原理和数学模型,通过对其公式的详细推导,为读者提供了清晰的理论基础。

文章首先介绍了M-P神经元模型,将其抽象为神经网络的基本组成单元。激活函数的选择是神经网络设计中关键的一步,文中提到了理想中的激活函数以及实际中常用的 s i g m o i d sigmoid sigmoid函数。

多层前馈神经网络的结构被详细介绍,说明了其层级结构和连接方式。这种结构的神经网络被广泛应用于各个领域,能够处理非线性关系,通过训练调整网络参数,实现对复杂模型的逼近,具有较强的自适应性和泛化能力。

误差逆传播算法是BP神经网络训练的核心,文章通过数学推导详细解释了权重和阈值的更新过程。梯度下降法是其中的关键步骤,通过计算误差对参数的偏导数,实现对参数的调整。

然后,文章提到了BP神经网络容易面临的问题之一,即过拟合。为了缓解过拟合,介绍了两种常用的方法:早停和正则化。早停通过在训练过程中监测验证集性能,及时停止训练,避免过度拟合。正则化通过修改损失函数引入额外的惩罚项,限制模型复杂性,有助于防止神经网络对训练数据过度拟合。

实验分析

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 读入数据集
data = pd.read_csv('data/predict_room_price.csv')

在这里插入图片描述
进行数据的预处理

# 特征和标签
X = data.drop('Price', axis=1)
y = data['Price']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分数据集
X_train, X_temp, y_train, y_temp = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
X_valid, X_test, y_valid, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

构建神经网络模型

# 创建BP神经网络模型
model = MLPRegressor(hidden_layer_sizes=(20, 20), max_iter=1000, random_state=42, alpha=0.01, learning_rate='adaptive')

训练、预测并评估模型性能

# 训练模型
model.fit(X_train, y_train)

# 在验证集上预测
y_valid_pred = model.predict(X_valid)


# 评估模型性能
valid_loss = mean_squared_error(y_valid, y_valid_pred)
print(f'Validation Loss: {valid_loss}')

# 在测试集上预测
y_test_pred = model.predict(X_test)

# 评估模型性能
test_loss = mean_squared_error(y_test, y_test_pred)
print(f'Test Loss: {test_loss}')

# 绘制损失曲线
plt.plot(model.loss_curve_)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Curve')
plt.show()
Validation Loss: 429.78130878683345
Test Loss: 436.7118813730095

在这里插入图片描述

residuals = y_test - y_test_pred
plt.scatter(y_test, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('True Values')
plt.ylabel('Residuals')
plt.title('Residuals Plot on Test Set')
plt.show()

在这里插入图片描述

from sklearn.metrics import r2_score

r2_valid = r2_score(y_valid, y_valid_pred)
print(f'R2 Score on Validation Set: {r2_valid}')

r2_test = r2_score(y_test, y_test_pred)
print(f'R2 Score on Test Set: {r2_test}')
R2 Score on Validation Set: 0.9939169086519464
R2 Score on Test Set: 0.9934083540996065

由上述评价指标可知:

  • 残差图:

    • 散点在区间[-80, 80]内,说明模型的预测相对较为准确,大多数样本的预测误差在这个范围内。
    • 点集中在[-20, 20]上,表示大部分样本的残差(实际值与预测值之差)都集中在这个范围内,这也表明模型的整体性能较好。
  • Validation Loss 和 Test Loss:非常低的Validation Loss和Test Loss,说明模型在验证集和测试集上都取得了很好的性能。这表明模型对数据的拟合效果很好,预测值与实际值之间的误差很小。

  • R2 Score on Validation Set 和 Test Set:非常接近于1的R2 Score,表明模型对于验证集和测试集的解释方差非常高。R2 Score是一个用于评估模型拟合程度的指标,接近1表示模型能够很好地解释目标变量的变异性。

总体来说,根据残差图、Validation Loss、Test Loss以及R2 Score的结果,模型表现出色,能够很好地拟合数据并具有较高的泛化能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【工具栏】RestfulTool 插件的使用(接口开发规范)

目录 1. 安装 2.使用 1. 安装 2.使用 点开控制层&#xff0c;该控制层写了什么接口一目了然 跳转对应的接口&#xff0c;查看代码

基于JAVA+ssm智能旅游线路规划系统设计与实现【附源码】

基于JAVAssm智能旅游线路规划系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql…

【Jmeter之get请求传递的值为JSON体实践】

Jmeter之get请求传递的值为JSON体实践 get请求的常见传参方式 1、在URL地址后面拼接&#xff0c;有多个key和value时&#xff0c;用&链接 2、在Parameters里面加上key和value 第一次遇到value的值不是字符串也不是整型&#xff0c;我尝试把json放到value里面&#xff0…

迅为RK3588开发板编译 Buildroot单独编译图形化界面三

第三步&#xff1a;编译 Recovery 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./build.sh 然后将光标移动到第四个 recovery&#xff0c;点击回车即可开始 recovery 的编译&#xff0c;编译过程如下所示&#xff1a; 编…

OpenAI推出GPT商店和ChatGPT Team服务

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT商店和ChatGPT Team服务 摘要&#xff1a;OpenAI正式推出了其GPT商店和ChatGPT Team服务。用户已经创建了超过300万个ChatGPT自定义版本&#xff0c;并分享给其他人使用。GPT商店集结了用户为各种任务创建的定制化ChatGPT&a…

重建传播网络并识别隐藏来源

1.摘要 我们从数据中揭示复杂网络结构和动态的能力&#xff0c;对于理解和控制复杂系统中的集体动态至关重要。尽管在这一领域已有近期进展&#xff0c;但如何从有限的时间序列中重建具有随机动态过程的网络仍然是一个突出问题。在这里&#xff0c;我们开发了一个基于压缩感知的…

微信小程序开发学习笔记《7》全局配置以及小程序窗口

微信小程序开发学习笔记《7》全局配置以及小程序窗口 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。全局配置官方文档 一、全局配置文件及常用的配置项 小程序根目录下的app.json 文件是小程序的全局配置文件。 常用的配置项如…

企业培训系统源码:构建智能、可扩展的学习平台

企业培训系统在现代企业中扮演着至关重要的角色。本文将通过深度解析企业培训系统的源码&#xff0c;介绍如何构建一个智能、可扩展的学习平台&#xff0c;涉及关键技术和代码实例。 1. 技术栈选择与项目初始化 在构建企业培训系统之前&#xff0c;选择适当的技术栈是至关重…

逆矩阵计算

目录 一、逆矩阵的定义 核心&#xff1a;AB BA E 1&#xff09;定义 2&#xff09;注意 3&#xff09;逆矩阵存在的条件|A| ! 0 二、核心公式&#xff1a; 三、求逆矩阵&#xff08;核心考点&#xff09; 1、伴随矩阵法 2、初等变换法&#xff08;重点掌握&#xff…

<蓝桥杯软件赛>零基础备赛20周--第14周--BFS

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

统计学-R语言-4.1

文章目录 前言编写R函数图形的控制和布局par函数layout函数 练习 前言 安装完R软件之后就可以对其进行代码的编写了。 编写R函数 如果对数据分析有些特殊需要&#xff0c;已有的R包或函数不能满足&#xff0c;可以在R中编写自己的函数。函数的定义格式如下所示&#xff1a; …

如何用Mac工具制作“苹果高管形象照”

大伙儿最近有没有刷到“苹果高管形象照”风格&#xff0c;详细说来就是&#xff1a; 以苹果官网管理层简介页面中&#xff0c;各位高管形象照为模型&#xff0c;佐以磨皮、美白、高光等修图术&#xff0c;打造的看上去既有事业又有时间有氧的证件照&#xff0c;又称“苹…

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

【QT实战】使用QT5制作一个简易串口助手详细教程,支持打包转发

文章目录 制作串口助手工程所涉及到的头文件ui布局制作串口配置选项添加修饰制作串口打印信息界面添加背景图片 函数查找串口并且添加到ui界面上显示串口数据接收槽函数串口发送槽函数打开串口槽函数 将串口助手封装成可执行文件 本项目的开发环境&#xff1a;windowsQT5qtcrea…

Vue-13、Vue绑定css样式

1、绑定css样式字符串写法&#xff0c;适用于&#xff1a;样式的类名不确定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>绑定css样式</title><!--引入vue--><script type"tex…

什么是reids缓存雪崩、穿透、击穿

1.Reids缓存雪崩 Redis缓存key同一时间大量失效&#xff0c;导致大量请求全部打到数据库&#xff0c;造成数据库挂掉 解决方案 设置缓存失效时间&#xff0c;随机初始化失效时间 部署集群的时候&#xff0c;把热点数据平均分布到不同redis节点上去 暴力方法&#xff0c;不…

逆变器简述

一般家用电器&#xff0c;像微波炉&#xff0c;电饭煲等都是直接插墙壁上的电就可以工作&#xff0c;所以这些家用电器是使用我们市电AC220V的电压 但我们用到的手机&#xff0c;电瓶车以及新能源汽车都是需要充电器的&#xff0c;所以这些用电产品里面都是有电池的&#xff0…

扩展服务集

实验 扩展服务集 实验目的&#xff1a; 1.掌握无线局域网的基本组成和设备连接关系。 2.学习使用无线AP配置无线局域网的基本技能。 实验环境&#xff1a; 实验环境&#xff1a; 计算机 模拟器软件 实验过程与步骤&#xff1a; 1.画拓扑结构图 2.在无线AP上配置SSID和WPA2-P…

软件测试|selenium 元素无此属性NoSuchAttributeException问题分析与解决

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到NoSuchAttributeException异常。这个异常通常在尝试访问一个元素的属性&#xff08;attribute&#xff09;时抛出&#xff0c;但该属性不存在。本文将介绍NoSuchAttributeException异常的常见原因以及解决方…

Android 集成firebase 推送(FCM)

1&#xff0c;集成firebase 基础 1>googleService文件 2>项目级gradle 3>app级gradle 4>setting 2&#xff0c;推送相关 重点&#xff1a; 源文档&#xff1a;设置 Firebase Cloud Messaging 客户端应用 (Android) (google.com) /*** 监听推送的消息* 三种情况…