基于 Python 进行二维空间线性可分数据单/多层感知器实战

目录

一、前言

二、什么是二维空间线性可分数据

三、感知器的数学模型

四、构造二维分类数据集

五、数据可视化

六、训练单层感知器

七、使用感知器进行预测

八、计算分类准确率

九、绘制决策边界

十、单层感知器的局限性

十一、多层感知器(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 生成样本。

代码:

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

可以说:

感知器是神经网络的起点,而多层感知器则打开了深度学习的大门。通过亲手实现二维空间分类任务,不仅能够理解模型原理,更能够真正体会"机器如何学习"的过程。

相关推荐
2601_950368911 小时前
稀土合金粉末采购指南:3步筛选靠谱镁钆供应商
大数据·运维·人工智能·python
金融RPA机器人丨实在智能1 小时前
最终决定选择实在Agent的关键因素通常是什么?
人工智能·ai
继续商行1 小时前
Go 内存调优:用逃逸分析减少堆分配
人工智能
luweis1 小时前
企智孪生 ETA (6.5 人机协同:定义“协作界面 (Collaboration UI)”)【杭州联保致新科技有限公司 卢伟舜】
网络·人工智能·科技·程序人生·创业创新·学习方法
泠不丁1 小时前
用本地 AI 大模型打造全天候家庭健康守护系统
人工智能
冬奇Lab1 小时前
每日一个开源项目(第123篇):白龙马 (BaiLongma) - 给 LLM 装上“主动意识”,开启 Agent 的 ACI 时代
人工智能·开源·资讯
土星云SaturnCloud1 小时前
边缘计算赋能烟草行业数字化转型
服务器·人工智能·ai·边缘计算
算力视野1 小时前
GPU、NPU、TPU有什么区别?
服务器·人工智能·gpu算力
Blb1236541 小时前
介电击穿科普:交流击穿与直流击穿有何区别?
人工智能·功能测试·制造·材料工程