SL Scikit-Learn Learn机器学习教程

Lesson 10

感知机:最简单的神经元

感知机是神经网络的起点——一个线性分类器加上权重更新规则。本章讲清它的工作原理、收敛性、以及线性不可分(异或)的致命局限。

  • 预计时长35 分钟
  • 难度中等
  • 前置章节第 06 章

本章细分学习地图

模块拆细学习单元完成后应产出掌握标准
结构输入、权重、偏置、激活函数。手画感知机图。能说清每个组件的作用。
更新规则错误驱动更新、学习率。手算一轮更新。能说清什么时候更新、更新多少。
线性不可分异或问题、收敛定理的前提。异或不可分的例子。能解释为什么需要多层网络。
实战Perceptron 分类。完整代码。能对比感知机和逻辑回归。

学习目标

感知机工作流程

1输入特征 x
2加权求和 z=wx+b
3阶跃激活
4输出类别

本章完成度

已完成 0/4

感知机结构

感知机是最简单的人工神经元:接收输入特征,加权求和,通过阶跃函数输出 +1 或 -1。

z = w₁x₁ + w₂x₂ + … + wpxp + b 加权求和:与线性回归完全相同
ŷ = sign(z) = { +1 if z ≥ 0, −1 if z < 0 } 阶跃激活:输出只有两个值
感知机 vs 逻辑回归

感知机用阶跃函数(硬判断),逻辑回归用 Sigmoid(软概率)。感知机没有概率输出,只有类别。

权重更新规则

感知机的学习策略极简:只在预测错误时更新权重。

w ← w + η · (y − ŷ) · x η 是学习率,y 是真实标签,ŷ 是预测标签

预测正确

y − ŷ = 0,不更新。

预测错误

y − ŷ ≠ 0,沿着修正方向调整权重。

import numpy as np

def perceptron_update(x, y_true, w, b, eta=0.1):
    """一步感知机更新"""
    z = np.dot(w, x) + b
    y_pred = 1 if z >= 0 else -1
    if y_pred != y_true:
        w = w + eta * (y_true - y_pred) * x
        b = b + eta * (y_true - y_pred)
    return w, b

# 示例
w = np.array([0.0, 0.0])
b = 0.0
x = np.array([1.0, 2.0])
y = 1
w, b = perceptron_update(x, y, w, b, eta=0.1)
print(f"更新后 w={w}, b={b}")
感知机收敛定理

如果数据线性可分,感知机一定会在有限步内收敛到一个正确的超平面。但如果不可分,它永远不会收敛。

线性不可分:异或问题

异或(XOR)是经典的线性不可分问题:没有任何一条直线能正确分开四个点。

x₁x₂XOR 输出
000
011
101
110
解决方案:多层网络

异或问题需要至少一个隐藏层。这就是"多层感知机(MLP)"的动机——通过叠加非线性层来解决线性不可分问题。下一章会详细讲。

sklearn 实战

from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score

X, y = load_iris(return_X_y=True)

# 只取前两类(线性可分)
mask = y < 2
X_bin, y_bin = X[mask], y[mask]

pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("perceptron", Perceptron(max_iter=1000, eta0=0.1, random_state=42)),
])
scores = cross_val_score(pipe, X_bin, y_bin, cv=5)
print(f"感知机准确率(二分类): {scores.mean():.3f} ± {scores.std():.3f}")

# 全三类
scores_all = cross_val_score(
    Pipeline([("scaler", StandardScaler()),
              ("perceptron", Perceptron(max_iter=1000, random_state=42))]),
    X, y, cv=5
)
print(f"感知机准确率(三分类): {scores_all.mean():.3f} ± {scores_all.std():.3f}")

练习题

第 1 题:感知机和逻辑回归最大的区别是什么?

参考思路:感知机用阶跃函数输出硬类别(+1/-1),没有概率;逻辑回归用 Sigmoid 输出 [0,1] 概率。感知机只在错误时更新,逻辑回归优化对数似然。

第 2 题:如果数据线性不可分,感知机会怎样?

参考思路:感知机永远不会收敛,权重会不断振荡。实践中通过设置 max_iter 强制停止。

检查点

离开本章前,请确认:

  • 能画出感知机结构:输入 → 加权求和 → 阶跃激活 → 输出。
  • 能解释权重更新规则,知道只在预测错误时更新。
  • 能用异或问题说明感知机的线性不可分局限。
  • 能用 sklearn 的 Perceptron 完成分类实战。