机器学习-分类之多层感知机原理及实战

机器学习-分类之多层感知机原理及实战讲解多层感知器并用其进行分类实战

多层感知机(Multi-Layer Perceptron)

简介

生物神经网络具有相互连接的神经元,神经元带有接受输入信号的树突,然后基于这些输入,它们通过轴突向另一个神经元产生输出信号。使用人工神经网络(ANN)来模拟这个过程,称为神经网络。神经网络是一个试图模仿自然生物神经网络的学习模式的机器学习框架。创建神经网络的过程从最基本的形式单个感知器开始。

感知器就是一个能够把训练集的正例和反例划分为两个部分的器件,并且能够对未来输入的数据进行分类。举个例子:一个小孩子的妈妈在教他什么是苹果什么不是,首先会去拿一个苹果过来说“这个是苹果”,然后拿一个水杯过来说“这不是”,然后拿一个稍微不一样的苹果过来说“这也是”,,,最后,小孩子学习到了用一个模型(判断苹果的标准)来判断什么是苹果什么不是。

感知器具有一个或者多个输入、偏置、激活函数和单个输出。感知器接受输入,将它们乘以一些权重,然后将它们传递到激活函数以产生输出。有许多激活函数可供选择,如逻辑函数、三角函数、阶跃函数等。我们还确保向感知器添加偏差,这避免了所有输入可能等于零的问题(这意味着没有乘以权重会有影响)。

原理

感知器的输入空间(特征空间)一般为 R n ⊇ X R^n\supseteq X RnX,即n维向量空间,输出空间为 Y = { + 1 , − 1 } Y=\{+1,-1\} Y={
+1,1}
− 1 -1 1代表反例, + 1 +1 +1代表正例。例如,输入 x ∈ X x\in X xX,对应于输入空间的 R n R^n Rn中的某个点,而输出 y ∈ Y y\in Y yY表示改点所在的分类。需要注意的是,输入 x x x是一个n维的向量,即 x = ( x 1 , x 2 , . . . x n ) x=(x_1,x_2,…x_n) x=(x1,x2,...xn)。现在,已经有了输入和输出的定义,就可以给出感知机 f ( x ) f(x) f(x)的模型: f ( x ) = s i g n ( w × x + b ) f(x)=sign(w\times x+b) f(x)=sign(w×x+b)其中,向量 x = ( x 1 , x 2 , . . . x n ) x=(x_1,x_2,…x_n) x=(x1,x2,...xn)中的每个分量代表输入向量空间 R n R^n Rn中向量 x x x的每个分量 x i x_i xi的权重,或者说参数。 b ∈ R b \in R bR称为偏差, w × x w \times x w×x表示向量 w w w x x x的内积, s i g n sign sign是一个符号函数,即 s i g n ( x ) = { + 1   x ≥ 0 − 1   x < 0 sign(x) =\begin{cases} +1 \ x\ge 0\\ -1 \ x<0 \end{cases} sign(x)={
+1 x01 x<0
上面这个函数 f ( x ) f(x) f(x)称为感知机。

神经网络简述

在使用神经网络前需要注意以下事项。

  1. 使用神经网络训练数据之前,必须确定神经网络层数,以及每层单元个数。
  2. 特征向量在被传入输入层时通常被先标准化(Normalize)到0和1之间。
  3. 离散型变量可以被编码成每一个输入单元对应一个特征可能赋的值。例如,特征值A可能取三个值( a 0 , a 1 , a 2 a_0,a_1,a_2 a0,a1,a2),可以使用3个输入单元来代表A,如果 A = a 0 A=a_0 A=a0,那么代表 a 0 a_0 a0的单元值就取1,其他取0;如果 A = a 1 A=a_1 A=a1,那么代表 a 1 a_1 a1的单元值就取1,其他取0,以此类推。
  4. 神经网络既可以用来做分类(Classification)问题,也可以解决回归(Regression)问题。对于分类问题,如果是两类,可以用一个输入单元表示(0和1分别代表两类),如果多于两类,每一个类别用一个输入单元表示,所以输入层的单元数量通常等于类别的数量,没有明确的规则来设计最好有多少个隐藏层,可以根据实验测试和误差,以及准确度来实验并改进最优的隐藏层数目。

实战

使用多层感知器分析,根据葡萄酒的各项化学特征来判断葡萄酒的优劣。使用sklearn封装的MLPClassifier
在代码中设定的参数solver=’lbfgs’为求解方法设置,一般有3个取值。

  • lbfgs:使用quasi-Newton方法的优化器。(小数据集更好,收敛快,效果好)
  • sgd:使用随机梯度下降。
  • adam:使用Kingma、DiederikheJimmy Ba提出的机遇随机梯度的优化器。(大数据集表现好)
import pandas as pd wine = pd.read_csv('data/wine.csv', names=["Cultivator", "Alchol", "Malic_Acid", "Ash", "Alcalinity_of_Ash", "Magnesium", "Total_phenols", "Falvanoids", "Nonflavanoid_phenols", "Proanthocyanins", "Color_intensity", "Hue", "OD280", "Proline"]) wine.head() wine.describe().transpose() print(wine.shape) X = wine.drop('Cultivator', axis=1) y = wine['Cultivator'] from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) from sklearn.neural_network import MLPClassifier mlp = MLPClassifier(hidden_layer_sizes=(13, 13, 13), max_iter=500) mlp.fit(X_train, y_train) predictions = mlp.predict(X_test) from sklearn.metrics import classification_report,confusion_matrix print(confusion_matrix(y_test, predictions)) print(classification_report(y_test, predictions)) len(mlp.coefs_) len(mlp.coefs_[0]) len(mlp.intercepts_[0]) 

补充说明

参考书《Python3数据分析与机器学习实战》,具体数据集和代码可以查看我的GitHub,欢迎star或者fork。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176665.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:21
下一篇 2026年3月26日 下午9:22


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号