go语言有啥好的网站开发框架,汕头企业建站模板,如何修改网站后台时间,无锡网站推广排名文章目录 一、算法概念二、算法原理#xff08;一#xff09;感知机#xff08;二#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点#xff08;一#xff09;优点#xff08;二#xff09;缺点 四、MLP分类任务实现… 文章目录 一、算法概念二、算法原理一感知机二多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点一优点二缺点 四、MLP分类任务实现对比一数据加载和样本分区1、Python代码2、Sentosa_DSML社区版 二模型训练1、Python代码2、Sentosa_DSML社区版 三模型评估和模型可视化1、Python代码2、Sentosa_DSML社区版 五、MLP回归任务实现对比一数据加载和样本分区1、Python代码2、Sentosa_DSML社区版 二模型训练1、Python代码2、Sentosa_DSML社区版 三模型评估和模型可视化1、Python代码2、Sentosa_DSML社区版 六、总结 一、算法概念
什么是多层感知机 多层感知机 (Multilayer PerceptronMLP) 是一种人工神经网络由多层神经元或节点组成这些神经元或节点以分层结构排列。它是最简单且使用最广泛的神经网络之一尤其适用于分类和回归等监督学习任务。 多层感知器运作的核心原理在于反向传播是用于训练网络的关键算法。在反向传播过程中网络通过将误差从输出层反向传播到输入层来调整其权重和偏差。这个迭代过程可以微调模型的参数使其能够随着时间的推移做出更准确的预测。 MLP 通常包括以下部分 输入层接收输入数据并将其传递到隐藏层。输入层中的神经元数量等于输入特征的数量。 隐藏层由一层或多层神经元组成用于执行计算并转换输入数据。可以调整每层 中的隐藏层和神经元的数量以优化网络性能。 激活函数对隐藏层中每个神经元的输出应用非线性变换。常见的激活函数包括 Sigmoid、ReLU、tanh 等。 输出层网络的最终输出例如分类标签或回归目标。输出层中的神经元数量取决于具体的数据例如分类问题中的类别数量。 权重和偏差可调节参数决定相邻层神经元之间的连接强度以及每个神经元的偏差。这些参数在训练过程中学习以尽量减少网络预测与实际目标值之间的差异。 损失函数衡量网络预测与实际目标值之间的差异。MLP 的常见损失函数包括回归任务的均方误差和分类任务的交叉熵。 MLP 使用梯度下降等优化算法反向传播进行训练根据损失函数的梯度迭代调整权重和偏差。这个过程持续到网络收敛到一组可最小化损失函数的最佳参数。
二、算法原理
一感知机 感知机由两层神经元组成输入层接收外界信号后传递给输出层如下图所示 感知机模型就是尝试找到一条直线能够把所有的二元类别分离开给定输入 x \mathbf{x} x 权重 W \mathbf{W} W 和偏移 b b b 感知机输出: o σ ( ⟨ w , x ⟩ b ) o\sigma\left( \langle\mathbf{w}, \mathbf{x} \rangleb \right) oσ(⟨w,x⟩b) σ ( x ) { 1 x 0 − 1 x ≤ 0 \quad\sigma( x )\left\{\begin{array} {l l} {{1}} {{\mathrm{~} x 0}} \\ {{-1}} {{\mathrm{~} x\leq0}} \\ \end{array} \right. σ(x){1−1 x0 x≤0 初始化权重向量 w 和偏置 b然后对于分类错误的样本不断更新w和b直到所有样本都被正确分类。等价于使用批量大小为1的梯度下降并使用如下的损失函数 ℓ ( y , x , w ) max ( 0 , − y ⟨ w , x ⟩ ) \ell( y, {\bf x}, {\bf w} )\operatorname* {m a x} ( 0,-y \langle{\bf w}, {\bf x} \rangle) ℓ(y,x,w)max(0,−y⟨w,x⟩) 感知机只能产生线性分割面感知机算法的训练过程如下。
二多层感知机
1、隐藏层 多层感知机则是在单层神经网络的基础上引入一个或多个隐藏层使神经网络有多个网络层下图为两个多层感知机示意图分别为单隐层和双隐层 多层感知机中的隐藏层和输出层都是全连接层输入 X ∈ R n × d X \in\mathbb{R}^{n \times d} X∈Rn×d 其中 n n n 是批量大小 d d d 是输入特征的数量。输出 O ∈ R n × q O \in\mathbb{R}^{n \times q} O∈Rn×q 其中 q q q 是输出单元的数量。 设隐藏层有 h h h 个隐藏单元隐藏层的输出 H H H 是通过输入 X X X 与隐藏层的权重 W h ∈ R d × h W_{h} \in\mathbb{R}^{d \times h} Wh∈Rd×h 和偏置 b h ∈ R 1 × h b_{h} \in\mathbb{R}^{1 \times h} bh∈R1×h 计算得到的 H X W h b h HX W_{h}b_{h} HXWhbh 输出层的权重为 W o ∈ R h × q W_{o} \in\mathbb{R}^{h \times q} Wo∈Rh×q 偏置为 b o ∈ R 1 × q b_{o} \in\mathbb{R}^{1 \times q} bo∈R1×q 。因此输出层的输出 O O O 为: O H W o b o OH W_{o}b_{o} OHWobo 将隐藏层的输出 H H H 代入到输出层的方程中得到如下计算过程 O ( X W h b h ) W o b o X W h W o b h W o b o O( X W_{h}b_{h} ) W_{o}b_{o}X W_{h} W_{o}b_{h} W_{o}b_{o} O(XWhbh)WoboXWhWobhWobo 通过联立后的式子可以看出尽管引入了隐藏层模型的计算仍然可以视作单层神经网络其中权重矩阵等于 W h W o W_{h} W_{o} WhWo偏置等于 b h W o b o b_{h} W_{o}b_{o} bhWobo。 这表示尽管引入了隐藏层在不采用非线性激活函数的情况下这个设计只能等价于单层神经网络。引入隐藏层的真正意义在于通过非线性激活函数如ReLU、Sigmoid等来引入复杂的非线性关系使得模型具备更强的表达能力。
2、激活函数 激活函数是 MLP的关键组成部分。它们将非线性引入网络使其能够对复杂问题进行建模。如果没有激活函数无论有多少层MLP都相当于单层线性模型。 激活函数需要具备以下几点性质:
连续并可导允许少数点上不可导便于利用数值优化的方法来学习网络参数激活函数及其导函数要尽可能的简单有利于提高网络计算效率激活函数的导函数的值域要在合适区间内不能太大也不能太小否则会影响训练的效率和稳定性 以下列举常用的三个激活函数
sigma函数 s i g m a ( z ) 1 1 exp ( − z ) sigma( z )\frac{1} {1\operatorname{e x p} (-z )} sigma(z)1exp(−z)1 sigma函数也称为 S \mathrm{S} S 型函数可以将任何实值数映射到 0 0 0 到 1 1 1 之间的值。呈S形具有明确定义的非零导数这使其适合与反向传播算法一起使用。 sigmoid函数的导数表达式为 s i g m a ′ ( z ) s i g m a ( z ) × ( 1 − s i g m a ( z ) ) sigma^{\prime} ( z )sigma( z ) \times( 1-sigma ( z ) ) sigma′(z)sigma(z)×(1−sigma(z)) 如下所示
tanh函数 tanh ( z ) 1 − exp ( − 2 z ) 1 exp ( − 2 z ) \operatorname{t a n h} ( z )\frac{1-\operatorname{e x p} (-2z )} {1\operatorname{e x p} (-2z )} tanh(z)1exp(−2z)1−exp(−2z) 双曲正切函数与逻辑函数类似但输出值在-1和 1 1 1 之间。这种居中效果有助于加快训练期间的收敛速度。 tanh导数表达式如下所示 t a n h ′ ( z ) 1 − tanh 2 ( z ) tanh^{\prime} ( z)1-\operatorname{t a n h}^{2} ( z ) tanh′(z)1−tanh2(z) 下面绘制了tanh函数的导数。当输入为0时tanh函数的导数达到最大值1当输入越偏离0时tanh函数的导数越接近0。
ReLU函数 R e L U ( z ) max ( 0 , z ) \mathrm{R e L U} ( z )\operatorname* {m a x} ( 0, z ) ReLU(z)max(0,z) ReLU 函数因其简单性和有效性而被广泛应用于深度学习。如果输入值为正则输出输入值否则输出零。尽管 ReLU 在零处不可微并且对于负输入具有零梯度但它在实践中表现良好有助于缓解梯度消失问题 当输入为负数时ReLU函数的导数为0当输入为正数时ReLU函数的导数为1 ReLU 函数的导数表达式为 R e L U ′ ( z ) { 1 i f z 0 0 i f z ≤ 0 R e L U^{\prime} ( z )\begin{cases} {{1}} {{\mathrm{i f ~} z 0}} \\ {{0}} {{\mathrm{i f ~} z \leq0}} \\ \end{cases} ReLU′(z){10if z0if z≤0 下面绘制ReLU函数的导数
3、反向传播算法
1、前向传播 前向传播是反向传播的前提。在前向传播过程中数据从输入层逐步传递至输出层经过每一层的计算最终得到预测输出。 具体步骤如下: 1、输入数据传递给神经网络的输入层。 2、输入层经过一系列权重W和偏置b的线性运算然后通过激活函数传递到隐藏层。 3、逐层传递直至数据到达输出层输出层生成预测值 y ^ \hat{y} y^ 。 表达式如下 y ^ f ( W 3 ⋅ f ( W 2 ⋅ f ( W 1 ⋅ x b 1 ) b 2 ) b 3 ) \hat{y}f ( W_{3} \cdot f ( W_{2} \cdot f ( W_{1} \cdot xb_{1} )b_{2} )b_{3} ) y^f(W3⋅f(W2⋅f(W1⋅xb1)b2)b3) 其中 W 1 , W 2 , W 3 W_{1}, W_{2}, W_{3} W1,W2,W3 是权重矩阵 b 1 , b 2 , b 3 b_{1}, b_{2}, b_{3} b1,b2,b3 是偏置 f ( ⋅ ) f ( \cdot) f(⋅) 是激活函数。 2、 损失函数 在得到输出后通过损失函数计算预测结果与真实标签之间的误差常见的损失函数有 MSE均方误差通常用于回归问题输出与标签之差的平方的均值。计算公式如下 M S E 1 n ∑ i 1 n ( y i − y ^ i ) 2 MSE\frac{1} {n} \sum_{i1}^{n} ( y_{i}-\hat{y}_{i} )^{2} MSEn1i1∑n(yi−y^i)2 其中 y i y_{i} yi 是真实值 y ^ i \hat{y}_{i} y^i 是预测值 n n n 是样本数量。 CE交叉熵损失通常用于回归问题。计算公式如下 H ( p , q ) − ∑ i 1 n p ( x i ) log q ( x i ) H(p,q)-\sum_{i1}^{n}p(x_{i}) \operatorname{log}q(x_{i}) H(p,q)−i1∑np(xi)logq(xi) 其中 p ( x i ) p ( x_{i} ) p(xi) 是真实分布 q ( x i ) q ( x_{i} ) q(xi) 是预测分布。 3、反向传播 反向传播根据微积分中的链式规则按相反的顺序从输入层遍历网络。用于权重更新使网络输出更接近标签。 假设有两个函数 y f ( u ) yf ( u ) yf(u) 和 u g ( x ) ug ( x ) ug(x) 根据链式法则 y y y 对 x x x 的导数为 ∂ y ∂ x ∂ y ∂ u ∂ u ∂ x \frac{\partial y} {\partial x}\frac{\partial y} {\partial u} \frac{\partial u} {\partial x} ∂x∂y∂u∂y∂x∂u 在神经网络中损失函数 L L L 对某一层权重 W W W 的导数可以通过链式法则分解为 ∂ L ∂ W ∂ L ∂ y ⋅ ∂ y ∂ W \frac{\partial L} {\partial W}\frac{\partial L} {\partial y} \cdot\frac{\partial y} {\partial W} ∂W∂L∂y∂L⋅∂W∂y 4、梯度下降 在反向传播过程中利用梯度下降算法来更新权重使得损失函数的值逐渐减小。权重更新的公式为: W ( h ) W ( o ) − η ⋅ ∂ L ∂ W W^{(h )}W^{( o )}-\eta\cdot\frac{\partial L} {\partial W} W(h)W(o)−η⋅∂W∂L 其中 η \eta η 是学习率决定了每次权重调整的步长大小 ∂ L ∂ W \frac{\partial L} {\partial W} ∂W∂L 是损失函数相对于权重的梯度。
三、算法优缺点
一优点 可以通过多个隐藏层和非线性激活函数学习到更复杂的特征表示从而提高模型的表达能力。 可以用于分类、回归和聚类等各种机器学习任务目在许多领域中取得了很好的效果。 可以诵过并行计算和GPU加速等技术高效地处理大规模数据集适用于大规模深度学习应用。
二缺点 参数较多容易在训练集上过拟合需要采取正则化、dropout等方法来缓解过拟合问题。 通常需要大量的标记数据进行训练并且在训练过程中需要较高的计算资源包括内存和计算 能力。 MLP的性能很大程度上依赖于超参数的选择。
四、MLP分类任务实现对比
一数据加载和样本分区
1、Python代码
from sklearn.datasets import load_iris# 加载iris数据集
iris load_iris()
X, y iris[data], iris[target]# 样本分区
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)2、Sentosa_DSML社区版 首先利用数据读入中的文本算子对数据进行读取 然后连接样本分区算子划分训练集和测试集 再接类型算子设置Feature列和Label列
二模型训练
1、Python代码 使用sklearn自动构建MLP模型
from sklearn.neural_network import MLPClassifier# 定义MLP分类器模型使用l-bfgs优化算法隐藏层设置为100, 50最大迭代次数200设置tol为0.000001
mlp_clf MLPClassifier(hidden_layer_sizes(100, 50), max_iter200, alpha1e-4,solverlbfgs, tol1e-6, random_state42)
# 训练模型
mlp_clf.fit(X_train, y_train)# 预测训练集和测试集
y_train_pred mlp_clf.predict(X_train)
y_test_pred mlp_clf.predict(X_test)2、Sentosa_DSML社区版 连接多层感知机分类算子右击算子点击运行可以得到多层感知机分类模型。右侧进行超参数等设置隐藏层设置为100, 50使用l-bfgs优化算法最大迭代次数200设置收敛偏差为0.000001。
三模型评估和模型可视化
1、Python代码
from sklearn.metrics import accuracy_score, precision_recall_fscore_support# 计算训练集评估指标
accuracy_train accuracy_score(y_train, y_train_pred)
precision_train, recall_train, f1_train, _ precision_recall_fscore_support(y_train, y_train_pred, averageweighted)# 计算测试集评估指标
accuracy_test accuracy_score(y_test, y_test_pred)
precision_test, recall_test, f1_test, _ precision_recall_fscore_support(y_test, y_test_pred, averageweighted)# 输出训练集评估指标
print(fTraining Set Metrics:)
print(fAccuracy: {accuracy_train * 100:.2f}%)
print(fWeighted Precision: {precision_train:.2f})
print(fWeighted Recall: {recall_train:.2f})
print(fWeighted F1 Score: {f1_train:.2f})# 输出测试集评估指标
print(f\nTest Set Metrics:)
print(fAccuracy: {accuracy_test * 100:.2f}%)
print(fWeighted Precision: {precision_test:.2f})
print(fWeighted Recall: {recall_test:.2f})
print(fWeighted F1 Score: {f1_test:.2f})from sklearn.metrics import confusion_matrix# 计算测试集的混淆矩阵
conf_matrix confusion_matrix(y_test, y_test_pred)import matplotlib.pyplot as plt
from sklearn.inspection import permutation_importance# 使用 sklearn 提供的permutation_importance方法计算特征重要性
result permutation_importance(mlp_clf, X_test, y_test, n_repeats10, random_state42)# 可视化特征重要性
plt.figure(figsize(8, 6))
plt.barh(range(X.shape[1]), result.importances_mean, aligncenter)
plt.yticks(np.arange(X.shape[1]), iris[feature_names])
plt.xlabel(Mean Importance Score)
plt.title(Permutation Feature Importance)
plt.show()2、Sentosa_DSML社区版 模型后可以连接评估算子对模型的分类结果进行评估。算子流如下图所示 执行完成后可以得到训练集和测试集的评估评估结果如下 右击模型查看模型的模型信息如下所示
五、MLP回归任务实现对比
一数据加载和样本分区
1、Python代码
# 读入winequality数据集
df pd.read_csv(D:/sentosa_ML/Sentosa_DSML/mlServer/TestData/winequality.csv)# 将数据集划分为特征和标签
X df.drop(quality, axis1) # 特征假设标签是 quality
Y df[quality] # 标签# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test train_test_split(X, Y, test_size0.2, random_state42)2、Sentosa_DSML社区版 首先通过数据读入算子读取数据 中间接样本分区算子对训练集和测试集进行划分 然后接类型算子设置Feature列和Label列
二模型训练
1、Python代码
使用 scikit-learn 库中的多层感知机回归模型MLPRegressor
# 对数据进行标准化
scaler StandardScaler()
X_train_scaled scaler.fit_transform(X_train)
X_test_scaled scaler.transform(X_test)# 定义MLP回归模型使用l-bfgs优化算法隐藏层设置为5010最大迭代次数300设置tol为0.000001
mlp_reg MLPRegressor(hidden_layer_sizes(50, 10), solverlbfgs, max_iter300, tol1e-6, random_state42)# 训练模型
mlp_reg.fit(X_train_scaled, y_train)2、Sentosa_DSML社区版 连接标准化算子对数据特征进行标准化计算并执行得到标准化模型 其次连接多层感知机回归算子右击执行得到多层感知机回归模型。模型训练使用l-bfgs优化算法隐藏层设置为5010最大迭代次数300设置收敛偏差为0.000001并选择计算特征重要性等。
三模型评估和模型可视化
1、Python代码
# 训练集上的评估
y_train_pred mlp_reg.predict(X_train_scaled)r2_train r2_score(y_train, y_train_pred)
mae_train mean_absolute_error(y_train, y_train_pred)
mse_train mean_squared_error(y_train, y_train_pred)
rmse_train np.sqrt(mse_train)
mape_train np.mean(np.abs((y_train - y_train_pred) / y_train)) * 100
smape_train 100 / len(y_train) * np.sum(2 * np.abs(y_train - y_train_pred) / (np.abs(y_train) np.abs(y_train_pred)))# 测试集上的评估
y_test_pred mlp_reg.predict(X_test_scaled)r2_test r2_score(y_test, y_test_pred)
mae_test mean_absolute_error(y_test, y_test_pred)
mse_test mean_squared_error(y_test, y_test_pred)
rmse_test np.sqrt(mse_test)
mape_test np.mean(np.abs((y_test - y_test_pred) / y_test)) * 100
smape_test 100 / len(y_test) * np.sum(2 * np.abs(y_test - y_test_pred) / (np.abs(y_test) np.abs(y_test_pred)))# 输出训练集评估指标
print(fTraining Set Metrics:)
print(fR²: {r2_train:.2f})
print(fMAE: {mae_train:.2f})
print(fMSE: {mse_train:.2f})
print(fRMSE: {rmse_train:.2f})
print(fMAPE: {mape_train:.2f}%)
print(fSMAPE: {smape_train:.2f}%)# 输出测试集评估指标
print(f\nTest Set Metrics:)
print(fR²: {r2_test:.2f})
print(fMAE: {mae_test:.2f})
print(fMSE: {mse_test:.2f})
print(fRMSE: {rmse_test:.2f})
print(fMAPE: {mape_test:.2f}%)
print(fSMAPE: {smape_test:.2f}%)# 计算残差
residuals y_test - y_test_pred# 使用 Seaborn 绘制带核密度估计的残差直方图
plt.figure(figsize(8, 6))
sns.histplot(residuals, kdeTrue, bins20)
plt.title(Residuals Histogram with KDE)
plt.xlabel(Residuals)
plt.ylabel(Frequency)
plt.grid(True)
plt.show()2、Sentosa_DSML社区版 模型后可接评估算子对模型的回归结果进行评估。 训练集和测试集的评估结果如下所示 右键查看模型信息可以得到特征重要性等可视化计算结果。
六、总结 相比传统代码方式利用Sentosa_DSML社区版完成机器学习算法的流程更加高效和自动化传统方式需要手动编写大量代码来处理数据清洗、特征工程、模型训练与评估而在Sentosa_DSML社区版中这些步骤可以通过可视化界面、预构建模块和自动化流程来简化有效的降低了技术门槛非专业开发者也能通过拖拽和配置的方式开发应用减少了对专业开发人员的依赖。 Sentosa_DSML社区版提供了易于配置的算子流减少了编写和调试代码的时间并提升了模型开发和部署的效率由于应用的结构更清晰维护和更新变得更加容易且平台通常会提供版本控制和更新功能使得应用的持续改进更为便捷。 为了非商业用途的科研学者、研究人员及开发者提供学习、交流及实践机器学习技术推出了一款轻量化且完全免费的Sentosa_DSML社区版。以轻量化一键安装、平台免费使用、视频教学和社区论坛服务为主要特点能够与其他数据科学家和机器学习爱好者交流心得分享经验和解决问题。文章最后附上官网链接感兴趣工具的可以直接下载使用
https://sentosa.znv.com/