目录
在上一篇文章中,我们学习了:
感知器(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 生成样本。
代码:
python
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个特征
五、数据可视化
绘制二维散点图:
python
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
实现。
代码:
python
from sklearn.linear_model import Perceptron
model = Perceptron(
max_iter=1000,
random_state=42
)
model.fit(X, y)
训练完成后:
python
print(model.coef_)
print(model.intercept_)
输出:
权重
偏置
即感知器学到的参数。
七、使用感知器进行预测
预测新样本:
python
sample = [[3,4]]
result = model.predict(sample)
print(result)
输出:
[1]
说明:
属于类别1
八、计算分类准确率
代码:
python
from sklearn.metrics import accuracy_score
y_pred = model.predict(X)
acc = accuracy_score(
y,
y_pred
)
print(acc)
输出:
0.98
说明:
准确率达到98%
对于线性可分数据。
单层感知器效果非常好。
九、绘制决策边界
最重要的一步。
观察感知器到底学到了什么。
代码:
python
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
十二、训练多层感知器
代码:
python
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模型
代码:
python
y_pred = mlp.predict(X)
acc = accuracy_score(
y,
y_pred
)
print(acc)
输出:
0.99+
对于简单数据集。
MLP通常能够达到更高精度。
十四、可视化MLP决策区域
创建网格:
python
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)
)
预测:
python
Z = mlp.predict(
np.c_[xx.ravel(),yy.ravel()]
)
Z = Z.reshape(xx.shape)
绘制:
python
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.txt
requirements:
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
可以说:
感知器是神经网络的起点,而多层感知器则打开了深度学习的大门。通过亲手实现二维空间分类任务,不仅能够理解模型原理,更能够真正体会"机器如何学习"的过程。