跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

深度学习基础:基于 Numpy 的感知机构建与训练

综述由AI生成感知机是线性分类器,适用于线性可分数据。感知机的数学模型、学习策略(最小化误分类点到超平面距离)及基于 Numpy 的实现细节。通过代码演示了如何构建感知机类、准备数据、训练模型并评估性能。文章还分析了感知机的局限性,如无法解决异或问题,并探讨了其向多层感知机(MLP)、SVM 等模型的延伸意义。

蓝绿部署发布于 2025/2/7更新于 2026/6/318 浏览
深度学习基础:基于 Numpy 的感知机构建与训练

1. 感知机模型

感知机(Perceptron)是一个线性分类器,其只适用于线性可分的数据。其数学表达形式为:

$$f(\mathbf{x}) = \text{sign}(\mathbf{w}^\mathrm{T} \mathbf{x} + b)$$

其中,$\mathbf{w}$ 是权重向量,$b$ 是偏置,$\mathbf{x}$ 是输入特征。函数 $\text{sign}$ 将输出映射到 -1 或 1。

感知机的目标是在所有的线性可分超平面构成的假设空间中,找到一个能使训练集中的数据可分的超平面。感知机并未对这一超平面做特殊要求,只要能区分开训练数据即可。因此,它找到的超平面并不一定是最优的,即可能只是恰好拟合了训练数据的超平面,其泛化能力并不佳。

2. 学习策略

由于直接最小化误分类点的个数并不可微,感知机的学习策略被设为:最小化误分类点到超平面的距离。

假设超平面为 $\mathbf{w}^\mathrm{T}\mathbf{x} + b = 0$,样本点 $(\mathbf{x}_i, y_i)$ 到超平面的距离为:

$$\frac{1}{||\mathbf{w}||} |\mathbf{w}^\mathrm{T}\mathbf{x}_i + b|$$

对于误分类点,有 $y_i(\mathbf{w}^\mathrm{T}\mathbf{x}_i + b) < 0$,因此损失函数可以定义为:

$$L(\mathbf{w}, b) = -\sum_{i \in M} y_i(\mathbf{w}^\mathrm{T}\mathbf{x}_i + b)$$

其中 $M$ 为误分类点的集合。

在初始化超平面的参数即法向量和偏置后,迭代地计算样本的损失并求出参数的梯度,再基于随机梯度下降(SGD)来更新参数即可,直到损失收敛后停止学习。

3. 基于 Numpy 的感知机实现

以下代码展示了如何使用 Python 和 Numpy 从零实现感知机算法。

import numpy as np

def prepare_data(n=100):
    """
    生成 OR 门数据集
    """
    def OR(x):
        # 定义 OR 门的真实权重和偏置用于生成标签
        w_true = np.array([0.5, 0.5])
        b_true = -0.2
        tmp = np.sum(w_true * x) + b_true
        # 统一使用 -1 和 1 作为标签以匹配感知机更新规则
        if tmp <= 0:
            return -1
        else:
            return 1

    input_size = 2
    inputs = np.random.randn(n, input_size)
    labels = np.array([OR(inputs[i]) for i in range(n)])
    return inputs, labels


class Perceptron:
    def __init__(self, input_size, lr=0.001):
        # 初始化权重和偏置
        self.w = np.random.randn(input_size)
        self.b = np.random.randn(1)
        self.lr = lr

    def predict(self, x):
        tmp = np.sum(self.w * x) + self.b
        if tmp <= 0:
            return -1
        else:
            return 1

    def update(self, x, y):
        # 基于 SGD 的参数更新(由最小化误分类点到超平面的距离求导可得)
        self.w = self.w + self.lr * y * x
        self.b = self.b + self.lr * y


if __name__ == "__main__":
    n = 1000     # 训练样本数
    ratio = 0.8  # 训练测试比
    input_size = 2

    print("Preparing Data {}".format(n))
    X, Y = prepare_data(n)
    clip_num = int(n * ratio)
    train_X, train_Y = X[:clip_num], Y[:clip_num]
    test_X, test_Y = X[clip_num:], Y[clip_num:]

    # Init model
    lr = 0.005
    model = Perceptron(input_size, lr)
    s = model.predict(X[0])
    print("Input: ({}, {}), Output: {}".format(X[0][0], X[0][1], s))

    # Training
    epochs = 100
    for i in range(epochs):
        loss = 0
        wrong_index = []
        print("\nEpoch {}".format(i+1))
        print("Forward Computing")
        for idx in range(clip_num):
            pred_y = model.predict(train_X[idx])
            if pred_y != train_Y[idx]:
                wrong_index.append(idx)
                tmp_loss = abs(float(np.sum(model.w * train_X[idx]) + model.b))
                loss += tmp_loss

        print("Wrong predict samples: {}, Loss: {}".format(len(wrong_index), loss))
        print("Learning")
        for j in wrong_index:
            model.update(train_X[j], train_Y[j])

    # Testing
    wrong_num = 0
    test_loss = 0
    for j in range(test_X.shape[0]):
        pred_y = model.predict(test_X[j])
        if pred_y != test_Y[j]:
            tmp_loss = abs(float(np.sum(model.w * test_X[j]) + model.b))
            test_loss += tmp_loss
            wrong_num += 1
    print("\nTest wrong predict samples: {}, Loss: {}".format(wrong_num, test_loss))

4. 感知机的局限性与延伸

感知机是线性模型,它不能学习非线性函数,因而它对线性不可分的数据束手无力。例如,感知机可以拟合与门(AND)、或门(OR)、**非门(NOT)产生的数据,但是不能处理好异或门(XOR)**产生的数据。

为什么无法解决 XOR 问题?

异或门(XOR)的真值表如下:

  • (0, 0) -> 0
  • (0, 1) -> 1
  • (1, 0) -> 1
  • (1, 1) -> 0

在二维平面上,类别为 1 的点位于对角线两端,类别为 0 的点位于另外两端。这两类数据无法用一条直线分开,因此线性感知机无法收敛到一个解。

模型的延伸

基于感知机,可以延伸出 LR(逻辑回归)、SVM(支持向量机) 等更强大的模型。此外,值得注意的是,虽然单个感知机的表达能力有限,但是如果将多个感知机叠加起来,则可以具备足够强的表达能力,即 Multi-layer Perception(MLP) 的通用近似定理(给定足够多的数据和足够宽的两层 MLP,可以近似任意连续函数)。

在《深度学习入门:基于 Python 的理论与实现》一书中有个直观的例子。假设用三个 Perceptron 分别拟合与门、非门和或门,再基于数字电路的知识将这三个门组合起来,即可以构成异或门。这展示了多层网络如何通过组合简单的线性单元来解决非线性问题。

5. 总结

本文详细介绍了感知机的基本原理、数学推导及代码实现。通过对比线性可分与不可分的情况,深入理解了感知机的局限性。在实际应用中,理解感知机的边界有助于选择合适的模型架构,例如在处理复杂非线性问题时转向神经网络或多层感知机。掌握基础的感知机算法是深入学习深度学习的必要前提。

目录

  1. 1. 感知机模型
  2. 2. 学习策略
  3. 3. 基于 Numpy 的感知机实现
  4. 4. 感知机的局限性与延伸
  5. 为什么无法解决 XOR 问题?
  6. 模型的延伸
  7. 5. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 类和对象进阶:默认成员函数与运算符重载
  • GitHub 全界面中文化:Tampermonkey 插件安装与配置指南
  • WorkBuddy 接入 QQ 机器人配置指南
  • VS Code + WSL 下 GitHub 访问与 Copilot 连接问题解决方案
  • Stable-Diffusion-v1-5 镜像部署:Web 界面与 Supervisor 自动恢复
  • 本地离线部署 Whisper 模型实现语音转写
  • C++ 异常处理机制详解
  • OpenClaw v2026.3.7 版本功能详解:AI 代理框架更新
  • 基于 Spring Boot 的在线 OJ 系统竞赛管理模块实现
  • 论文阅读--Agent AI 探索多模态交互的前沿领域(一)
  • DashDot 结合 cpolar 实现服务器轻量级远程监控指南
  • B 站生态观察:从二次元社区到 AI 创新孵化器
  • Flutter 三方库 huggingface_client 的鸿蒙化适配指南
  • OpenClaw 推动低代码 AI 向执行层演进:从工具赋能到生态重构
  • ROS1 机器人 SLAM:Gmapping 算法详解与实战
  • 滑动窗口算法实战:两道经典题深度解析
  • Windows 部署 OpenClaw:本地 AI 助手搭建与公网访问指南
  • 金仓 KingbaseES 融合架构实践:从多库并存到一库多能
  • Python 在 Windows 系统上的安装与验证指南
  • OpenClaw 集成 QVeris 实现 AI 实时数据查询

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online