目录
一、前言
二、什么是二维空间线性可分数据
三、感知器的数学模型
四、构造二维分类数据集
五、数据可视化
六、训练单层感知器
七、使用感知器进行预测
八、计算分类准确率
九、绘制决策边界
十、单层感知器的局限性
十一、多层感知器(MLP)
十二、训练多层感知器
十三、评估MLP模型
十四、可视化MLP决策区域
十五、单层感知器与MLP对比
十六、完整项目结构
十七、实战扩展
十八、面试高频问题
什么是线性可分数据?
感知器能解决什么问题?
为什么感知器无法解决XOR?
多层感知器相比感知器优势是什么?
MLP中的隐藏层作用是什么?
Perceptron与MLP本质区别?
十九、总结
在上一篇文章中,我们学习了:
感知器(Perceptron) 单层神经网络 多层神经网络 梯度下降 反向传播但是很多同学学习完理论后都会产生疑问:
感知器到底长什么样? 如何训练一个感知器? 单层感知器和多层感知器有什么区别? 为什么说单层感知器只能解决线性可分问题?本文将通过:
Python Numpy Matplotlib Scikit-Learn构建二维空间数据集,并分别使用:
单层感知器 多层感知器(MLP)完成分类任务。
通过可视化决策边界,真正理解感知器的工作原理。
二、什么是二维空间线性可分数据
所谓线性可分(Linearly Separable):
存在一条直线 能够把两类数据完全分开例如:
| x1 | x2 | 类别 |
|---|---|---|
| 1 | 2 | 0 |
| 2 | 1 | 0 |
| 5 | 6 | 1 |
| 6 | 5 | 1 |
图形表现:
如果存在:
一条直线 Ax + By + C = 0能够将两类样本完全隔开。
那么该数据集就是:
线性可分数据三、感知器的数学模型
单个感知器结构:
计算过程:
z = w1*x1 + w2*x2 + b然后经过激活函数:
if z > 0: 输出1 else: 输出0其中:
w 权重 b 偏置训练过程实际上就是:
不断调整权重和偏置使分类准确率越来越高。
四、构造二维分类数据集
使用 Sklearn 生成样本。
代码:
from sklearn.datasets import make_classification X, y = make_classification( n_samples=200, n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1, class_sep=2, random_state=42 ) print(X.shape)输出:
(200, 2)表示:
200个样本 2个特征五、数据可视化
绘制二维散点图:
import matplotlib.pyplot as plt plt.scatter( X[:,0], X[:,1], c=y, cmap='coolwarm' ) plt.xlabel("x1") plt.ylabel("x2") plt.show()结果:
红色点 蓝色点明显能够被一条直线分开。
这正是:
线性可分数据六、训练单层感知器
Sklearn提供:
Perceptron实现。
代码:
from sklearn.linear_model import Perceptron model = Perceptron( max_iter=1000, random_state=42 ) model.fit(X, y)训练完成后:
print(model.coef_) print(model.intercept_)输出:
权重 偏置即感知器学到的参数。
七、使用感知器进行预测
预测新样本:
sample = [[3,4]] result = model.predict(sample) print(result)输出:
[1]说明:
属于类别1八、计算分类准确率
代码:
from sklearn.metrics import accuracy_score y_pred = model.predict(X) acc = accuracy_score( y, y_pred ) print(acc)输出:
0.98说明:
准确率达到98%对于线性可分数据。
单层感知器效果非常好。
九、绘制决策边界
最重要的一步。
观察感知器到底学到了什么。
代码:
import numpy as np w = model.coef_[0] b = model.intercept_[0] x_line = np.linspace( X[:,0].min(), X[:,0].max(), 100 ) y_line = -(w[0]*x_line+b)/w[1] plt.scatter( X[:,0], X[:,1], c=y, cmap='coolwarm' ) plt.plot( x_line, y_line, color='black' ) plt.show()效果:
一条直线 将两类样本分开这就是:
感知器学习到的决策边界十、单层感知器的局限性
感知器有一个著名缺陷:
只能解决线性可分问题例如:
XOR问题数据:
| x1 | x2 | 输出 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
图形:
flowchart LR A[(0,0)] B[(1,1)] C[(0,1)] D[(1,0)]此时:
不存在一条直线 能够完成分类因此:
单层感知器失败十一、多层感知器(MLP)
为了解决非线性问题。
研究人员引入:
隐藏层结构:
这就是:
MLP Multi Layer Perceptron十二、训练多层感知器
代码:
from sklearn.neural_network import MLPClassifier mlp = MLPClassifier( hidden_layer_sizes=(10,), max_iter=3000, random_state=42 ) mlp.fit(X, y)参数说明:
10 隐藏层神经元数量训练完成:
print("训练完成")十三、评估MLP模型
代码:
y_pred = mlp.predict(X) acc = accuracy_score( y, y_pred ) print(acc)输出:
0.99+对于简单数据集。
MLP通常能够达到更高精度。
十四、可视化MLP决策区域
创建网格:
xx, yy = np.meshgrid( np.linspace(X[:,0].min()-1, X[:,0].max()+1, 200), np.linspace(X[:,1].min()-1, X[:,1].max()+1, 200) )预测:
Z = mlp.predict( np.c_[xx.ravel(),yy.ravel()] ) Z = Z.reshape(xx.shape)绘制:
plt.contourf( xx, yy, Z, alpha=0.3 ) plt.scatter( X[:,0], X[:,1], c=y ) plt.show()观察:
MLP形成复杂决策区域而不仅仅是一条直线。
十五、单层感知器与MLP对比
| 对比项 | 单层感知器 | MLP |
|---|---|---|
| 隐藏层 | 无 | 有 |
| 表达能力 | 低 | 高 |
| XOR问题 | 不支持 | 支持 |
| 非线性分类 | 不支持 | 支持 |
| 训练速度 | 快 | 较慢 |
| 应用场景 | 简单分类 | 深度学习基础 |
十六、完整项目结构
project │ ├── data.py ├── train_perceptron.py ├── train_mlp.py ├── visualize.py └── requirements.txtrequirements:
numpy matplotlib scikit-learn安装:
pip install numpy matplotlib scikit-learn十七、实战扩展
可以进一步尝试:
增加样本数量 增加噪声 增加隐藏层 调整学习率 调整神经元数量例如:
MLPClassifier( hidden_layer_sizes=(32,16,8) )形成:
三层隐藏层神经网络更加接近真实深度学习模型。
十八、面试高频问题
什么是线性可分数据?
存在一条直线 能够分开两类样本感知器能解决什么问题?
线性分类问题为什么感知器无法解决XOR?
XOR不是线性可分数据多层感知器相比感知器优势是什么?
具备非线性表达能力MLP中的隐藏层作用是什么?
提取特征 学习复杂关系Perceptron与MLP本质区别?
是否存在隐藏层十九、总结
通过本次实战,我们完成了:
二维空间数据生成 单层感知器训练 分类预测 决策边界可视化 多层感知器训练 MLP分类实践并理解了:
单层感知器 只能学习线性边界而:
多层感知器 能够学习复杂非线性边界整个神经网络的发展路线实际上就是:
感知器 ↓ 多层感知器 ↓ 深度神经网络 ↓ CNN/RNN ↓ Transformer ↓ GPT可以说:
感知器是神经网络的起点,而多层感知器则打开了深度学习的大门。通过亲手实现二维空间分类任务,不仅能够理解模型原理,更能够真正体会“机器如何学习”的过程。