目录

一、引言

二、感知机模型

感知机的几何解释

三、感知机学习策略

(一)数据集的线性可分性

(二)感知机学习策略

(三)感知机的损失函数定义

四、感知机学习算法

(一)感知机学习算法的原始形式

算法 1(感知机学习算法的原始形式)

感知机学习算法原始形式的应用

Python代码完整展示

(二)感知机学习算法的对偶形式

算法 2(感知机学习算法的对偶形式)

感知机学习算法的对偶形式的应用

Python代码完整展示

​编辑

五、本文概要

六、习题

七、总结


一、引言

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取 + 1 和 - 1 二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的输入实例进行分类。感知机 1957 年由 Rosenblatt 提出,是神经网络与支持向量机的基础。

本文首先介绍感知机模型;然后叙述感知机的学习策略,特别是损失函数;最后介绍感知机学习算法,包括原始形式和对偶形式,并证明算法的收敛性。

二、感知机模型

定义 : 假设输入空间(特征空间)是 ,输出空间是 Y={+1,−1}。输入 x∈X 表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y∈Y 表示实例的类别。由输入空间到输出空间的如下函数:

f(x)=sign(w⋅x+b)

称为感知机。其中,w 和 b 为感知机模型参数, 叫作权值(weight)或权值向量(weight vector),b∈R 叫作偏置(bias),w⋅x 表示 w 和 x 的内积。sign 是符号函数,即

感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合 {f∣f(x)=w⋅x+b}。

感知机的几何解释

感知机有如下几何解释:线性方程

w⋅x+b=0

对应于特征空间  中的一个超平面 S,其中 w 是超平面的法向量,b 是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面 S 称为分离超平面(separating hyperplane)。

感知机学习,由训练数据集(实例的特征向量及类别)

其中,求得感知机模型,即求得模型参数 w,b。感知机预测,通过学习得到的感知机模型,对于新的输入实例输出其对应的输出类别。

三、感知机学习策略

(一)数据集的线性可分性

定义 :给定一个数据集

其中如果存在某个超平面 S

w⋅x+b=0

能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有  的实例 i,有 ,对所有  的实例 i,有 ,则称数据集 T 为线性可分数据集(linearly separable data set);否则,称数据集 T 线性不可分。

(二)感知机学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数 w,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。

损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数 w,b 的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面 S 的总距离,这是感知机所采用的。为此,首先写出输入空间  中任一点  到超平面 S 的距离:

这里,∥w∥ 是 w 的 ​ 范数。

其次,对于误分类的数据  来说,

成立。因为当  时,;而当  时,。因此,误分类点  到超平面 S 的距离是

这样,假设超平面 S 的误分类点集合为 M,那么所有误分类点到超平面 S 的总距离为

不考虑 ,就得到感知机学习的损失函数。

(三)感知机的损失函数定义

给定训练数据集

其中,。感知机 sign(w⋅x+b) 学习的损失函数定义为

其中 M 为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。

显然,损失函数 L(w,b) 是非负的。如果没有误分类点,损失函数值是 0。而且,误分类点越少,误分类点离超平面越近,损失函数值就越小。一个特定的样本点的损失函数:在误分类时是参数 w,b 的线性函数,在正确分类时是 0。因此,给定训练数据集 T,损失函数 L(w,b) 是 w,b 的连续可导函数。

感知机学习的策略是在假设空间中选取使损失函数最小的模型参数 w,b,即感知机模型。

四、感知机学习算法

感知机学习问题转化为求解损失函数的最优化问题,最优化的方法是随机梯度下降法。本文叙述感知机学习的具体算法,包括原始形式和对偶形式,并证明在训练数据线性可分条件下感知机学习算法的收敛性。

(一)感知机学习算法的原始形式

感知机学习算法是对以下最优化问题的算法。给定一个训练数据集

其中,,求参数 w,b,使其为以下损失函数极小化问题的解

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

感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。首先,任意选取一个超平面 ,然后用梯度下降法不断地极小化目标函数。极小化过程中不是一次使 M 中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。假设误分类点集合 M 是固定的,那么损失函数 L(w,b) 的梯度由

​给出。

随机选取一个误分类点 ,对 w,b 进行更新:

式中 η(0<η⩽1) 是步长,在统计学习中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数 L(w,b) 不断减小,直到为 0。

算法 1(感知机学习算法的原始形式)

输入:训练数据集 ,其中 ,i=1,2,⋯,N;学习率 η(0<η⩽1);

输出:w,b;感知机模型 f(x)=sign(w⋅x+b)。

(1)选取初值

(2)在训练集中选取数据

(3)如果

(4)转至(2),直至训练集中没有误分类点。

这种学习算法直观上的解释:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整 w,b 的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。

算法 1 是感知机学习的基本算法,对应于后面的对偶形式,称为原始形式。感知机学习算法简单且易于实现。

感知机学习算法原始形式的应用

例 1 训练数据集的正实例点是,负实例点是 ,试用感知机学习算法的原始形式求感知机模型 f(x)=sign(w⋅x+b)(其中 )。

解 构建最优化问题:

按照算法 1 求解 w,b(取 η=1):

(1)取初值

(2)对 ,未能被正确分类,更新 w,b:

得到线性模型

(3)对 ,被正确分类,不修改 w,b;对 ,被误分类,更新 w,b:

得到线性模型

如此继续迭代,直到 ,此时线性模型为 ,对所有数据点 ,没有误分类点,损失函数达到极小。

分离超平面为:

感知机模型为:

迭代过程见表 1。

表 1 例 1 求解的迭代过程

迭代次数误分类点wbw⋅x+b
0000
1x_1(3,3)^T13x^{(1)}+3x^{(2)}+1
2x_3(2,2)^T02x^{(1)}+2x^{(2)}
3x_3(1,1)^T−1x^{(1)}+x^{(2)}-1
4x_3(0,0)^T−2−2
5x_1(3,3)^T−13x^{(1)}+3x^{(2)}-1
6x_3(2,2)^T−22x^{(1)}+2x^{(2)}-2
7x_3(1,1)^T−3x^{(1)}+x^{(2)}-3
80(1,1)^T−3x^{(1)}+x^{(2)}-3

这是在计算中误分类点先后取 ​ 得到的分离超平面和感知机模型。如果在计算中误分类点依次取 ,那么得到的分离超平面是

可见,感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。

Python代码完整展示
import numpy as np

class PerceptronOriginal:
    def __init__(self, learning_rate=1):
        self.lr = learning_rate  # 学习率
        self.w = None            # 权重向量
        self.b = 0               # 偏置项

    def fit(self, X, y, max_iter=100):
        n_samples, n_features = X.shape
        self.w = np.zeros(n_features)  # 初始化权重为0向量
        for _ in range(max_iter):
            updated = False  # 标记本轮是否更新参数
            for i in range(n_samples):
                xi, yi = X[i], y[i]
                # 误分类条件:y_i(w·x_i + b) ≤ 0
                if yi * (np.dot(self.w, xi) + self.b) <= 0:
                    # 更新参数:w ← w + η·y_i·x_i ; b ← b + η·y_i
                    self.w += self.lr * yi * xi
                    self.b += self.lr * yi
                    updated = True
                    break  # 随机梯度下降,仅更新一个误分类点
            if not updated:  # 无更新时,数据已线性可分
                break

    def predict(self, X):
        return np.sign(np.dot(X, self.w) + self.b)  # 符号函数输出类别

    def get_separator(self):
        return self.w, self.b  # 返回权重和偏置


# 数据:正样本x1=(3,3), x2=(4,3);负样本x3=(1,1)
X = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])  # 标签:正样本1,负样本-1

# 训练感知机(学习率η=1)
perceptron = PerceptronOriginal(learning_rate=1)
perceptron.fit(X, y)

# 输出结果
w, b = perceptron.get_separator()
print("感知机模型:f(x) = sign({}·x + {})".format(w, b))
print("分离超平面:{}x₁ + {}x₂ + {} = 0".format(w[0], w[1], b))
print("样本预测结果:", perceptron.predict(X))

程序运行截图展示:

(二)感知机学习算法的对偶形式

对偶形式的基本想法是,将 w 和 b 表示为实例 x_i​ 和标记 y_i​ 的线性组合的形式,通过求解其系数来得到 w 和 b。不失一般性,在算法 1 中可假设初始值  均为 0。对误分类点,通过

逐步修改 w,b。设修改 n 次,则 w,b 关于  的增量分别是 ​ 和 ,这里  是点 被误分类的次数)。这样,最后学习到的 w,b 可分别表示为:

其中 ;当 η=1 时,​ 表示第 i 个实例点因误分而更新的次数(更新次数越多,说明该实例越难正确分类,对学习结果影响越大)。

算法 2(感知机学习算法的对偶形式)

输入:线性可分的数据集 (其中,i=1,2,⋯,N);学习率 η(0<η⩽1)。输出:α,b;感知机模型 (其中 )。

  1. 初始化:α←0,b←0;
  2. 在训练集中选取数据
  3. ,则更新参数:
  4. 重复步骤 2 - 3,直到没有误分类数据。

对偶形式中训练实例仅以内积形式出现。为方便计算,可预先将训练集

的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的 Gram 矩阵(Gram matrix)

感知机学习算法的对偶形式的应用

例 2 数据同例 1,正样本点是 ,负样本点是 ,试用感知机学习算法对偶形式求感知机模型。

解 按照算法 2,取 ;(1) 计算 Gram 矩阵

​​(2) 计算算法 2

(3) 误分条件

参数更新

(4) 迭代过程从略,结果列于表 2;

(5)

分离超平面

感知机模型

表 2 例 2 求解的迭代过程

k\alpha _1\alpha _2\alpha _3b
00000
11001
21010
3102-1
4103-2
5203-1
6204-2
7205-3

对照例 1,结果一致,迭代步骤也是互相对应的。与原始形式一样,感知机学习算法的对偶形式迭代是收敛的,存在多个解。

Python代码完整展示
import numpy as np

class PerceptronDual:
    def __init__(self, learning_rate=1):
        self.lr = learning_rate  # 学习率
        self.alpha = None        # 对偶形式系数(记录样本更新次数)
        self.b = 0               # 偏置项
        self.X = None            # 训练样本(用于Gram矩阵)
        self.y = None            # 训练标签

    def _gram(self):
        """计算Gram矩阵:G[i,j] = x_i · x_j"""
        n = len(self.X)
        G = np.zeros((n, n))
        for i in range(n):
            for j in range(n):
                G[i, j] = np.dot(self.X[i], self.X[j])
        return G

    def fit(self, X, y, max_iter=100):
        self.X, self.y = X, y
        n_samples = len(X)
        self.alpha = np.zeros(n_samples)  # 初始化系数为0(默认float64)
        G = self._gram()                  # 预计算Gram矩阵
        for _ in range(max_iter):
            updated = False
            for i in range(n_samples):
                xi, yi = X[i], y[i]
                # 误分类条件:y_i(Σ(α_j·y_j·x_j·x_i) + b) ≤ 0
                sigma = np.sum(self.alpha * self.y * G[:, i])
                if yi * (sigma + self.b) <= 0:
                    # 更新系数α和偏置b
                    self.alpha[i] += self.lr
                    self.b += self.lr * yi
                    updated = True
                    break
            if not updated:
                break

    def predict(self, X_test):
        y_pred = []
        for x in X_test:
            # 预测:sign(Σ(α_j·y_j·x_j·x) + b)
            sigma = np.sum(self.alpha * self.y * [np.dot(xj, x) for xj in self.X])
            y_pred.append(np.sign(sigma + self.b))
        return np.array(y_pred)

    def get_original_params(self):
        """还原为原始形式的w和b:w=Σ(α_i·y_i·x_i);b=Σ(α_i·y_i)"""
        # 显式指定w为float64类型,避免int与float的类型冲突
        w = np.zeros_like(self.X[0], dtype=np.float64)
        for i in range(len(self.X)):
            w += self.alpha[i] * self.y[i] * self.X[i]
        return w, self.b


# 数据(正样本x1=(3,3)、x2=(4,3);负样本x3=(1,1))
X = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])

# 训练对偶形式感知机
perceptron_dual = PerceptronDual(learning_rate=1)
perceptron_dual.fit(X, y)

# 还原为原始参数并输出
w, b = perceptron_dual.get_original_params()
print("\n对偶形式还原的感知机模型:f(x) = sign({}·x + {})".format(w, b))
print("分离超平面:{}x₁ + {}x₂ + {} = 0".format(w[0], w[1], b))
print("样本预测结果:", perceptron_dual.predict(X))

五、本文概要

  1. 感知机是根据输入实例的特征向量 x 对其进行二类分类的线性分类模型:f(x)=sign(w⋅x+b)感知机模型对应于输入空间(特征空间)中的分离超平面 w⋅x+b=0。

  2. 感知机学习的策略是极小化损失函数:,损失函数对应于误分类点到分离超平面的总距离。

  3. 感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法,有原始形式和对偶形式。算法简单且易于实现。原始形式中,首先任意选取一个超平面,然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。

  4. 当训练数据集线性可分时,感知机学习算法是收敛的。感知机算法在训练数据集上的误分类次数 k 满足不等式:,当训练数据集线性可分时,感知机学习算法存在无穷多个解,其解由于不同的初值或不同的迭代顺序而可能有所不同。

感知机最早在 1957 年由 Rosenblatt 提出。Novikoff,Minsky 与 Papert 等人对感知机进行了一系列理论研究。感知机的扩展学习方法包括口袋算法(pocket algorithm)、表决感知机(voted perceptron)、带边缘感知机(perceptron with margin)。

六、习题

1.Minsky 与 Papert 指出:感知机因为是线性模型,所以不能表示复杂的函数,如异或(XOR)。验证感知机为什么不能表示异或。

证明:

异或是一种二元逻辑运算,输入为两个二进制变量 ,输出规则为:当两个输入不同时输出 1,相同时输出 0。其真值表如下:

输入 x_1输入 x_2输出 y(XOR 结果)
000
011
101
110

感知机是二分类线性模型,其输出为 ,其中 sign(⋅) 为符号函数(正数输出 + 1,负数输出 - 1)。为适配感知机的输出形式,将异或的输出 y 映射为二分类标签:

  • 原输出 0 → 标签 - 1(负样本);
  • 原输出 1 → 标签 + 1(正样本)。

因此,异或问题的训练样本可表示为:T={(0,0,−1), (0,1,+1), (1,0,+1), (1,1,−1)}

感知机的目标是找到一个线性超平面(在二维输入下为一条直线):

使得:

  • 正样本(y=+1)满足
  • 负样本(y=−1)满足

这种 “可用一条直线将正负样本完全分开” 的性质,称为线性可分。若无法找到这样的直线,则问题为线性不可分,感知机无法表示。

假设存在参数  使得感知机可表示异或,则需满足以下 4 个不等式(对应 4 个样本):

  1. 对样本 (0,0,−1)(负样本):

  2. 对样本 (0,1,+1)(正样本):

  3. 对样本 (1,0,+1)(正样本):

  4. 对样本 (1,1,−1)(负样本):

推导矛盾:

  • 由(1)知 b<0,设 b=−k(其中 k>0,将负数转化为正数便于分析)。
  • 代入(2):
  • 代入(3):
  • 由(5)和(6)相加:
  • 代入(4):

此时(7)与(8)矛盾:

由于 k>0,2k<k 不可能成立。因此,不存在满足条件的 ,即异或问题线性不可分。

将异或的 4 个样本点画在二维平面上

  • 负样本(y=−1):(0,0) 和 (1,1)(分布在对角线两端);
  • 正样本(y=+1):(0,1) 和 (1,0)(分布在另一条对角线两端)。

显然,无法用一条直线将这两类样本完全分开(无论直线如何摆放,总会有正样本和负样本在直线同侧)。

因此,可以证明感知机是线性分类模型,仅能处理线性可分问题;而异或问题是线性不可分的,因此感知机无法表示异或函数。这正是 Minsky 与 Papert 指出的感知机的局限性 —— 无法处理非线性关系。

2.证明以下定理:样本集线性可分的充分必要条件是正实例点集所构成的凸壳  与负实例点集所构成的凸壳互不相交。

证明:

  1. 凸壳(Convex Hull):集合 S 的凸壳 conv(S) 是包含 S 的最小凸集,数学表达为:即凸壳由 S 中元素的凸组合(加权和,权重非负且和为 1)构成。

  2. 线性可分:若存在超平面 w⋅x+b=0,使得对所有正实例 ​,有 w⋅x+b>0;对所有负实例 ​,有 w⋅x+b<0,则称样本集 ​ 线性可分。

必要性证明(线性可分 ⇒ 与  不相交)

思路:假设样本集线性可分,若凸壳相交则导出矛盾,故凸壳必不相交。

设样本集 ​ 线性可分,即存在超平面 w⋅x+b=0,满足:

  • 对任意 ,w⋅x+b>0;
  • 对任意 ,w⋅x+b<0。

反证法:假设 ,即存在

  1. 由  推导:根据凸壳定义,存在 ​ 和系数 ,使得:;由于 ​,故 。将上式代入超平面方程:;因  且至少一个 ,同时 ,故求和结果满足:

  2. 推导:同理,存在  和系数 ,使得:;​由于 ​,故 。代入超平面方程:;因  且至少一个 ,同时 ,故求和结果满足:w⋅z+b<0

  3. 矛盾导出:w⋅z+b 无法同时 “>0” 和 “<0”,与假设矛盾。因此 ,即凸壳互不相交。

充分性证明(与  不相交 ⇒ 线性可分)

思路:利用凸集分离定理,证明不相交的凸壳可被超平面严格分离,从而样本集线性可分。

凸集分离定理(简化版):在 Rn 中,若两个非空凸集 A,B 不相交(A∩B=∅),则存在超平面 w⋅x+b=0 严格分离 A 和 B,即:

  • 对所有 x∈A,w⋅x+b>0;
  • 对所有 x∈B,w⋅x+b<0。

由于  和  是  中的凸集(凸壳本身是凸集),且,根据凸集分离定理,存在超平面 w⋅x+b=0 严格分离它们:

  • 对所有 ,w⋅x+b>0;
  • 对所有 ,w⋅x+b<0。

又因为 ,因此:

  • 对所有 ,w⋅x+b>0;
  • 对所有 ​,w⋅x+b<0。

即样本集 ​ 线性可分。

因此,可以证明样本集线性可分的充分必要条件是:正实例点集的凸壳  与负实例点集的凸壳  互不相交。

七、总结

本文系统介绍了感知机模型及其学习算法。感知机是二类分类的线性模型,通过分离超平面实现分类。文章详细阐述了感知机模型定义、几何解释、学习策略(基于误分类的损失函数),并给出了原始形式和对偶形式两种学习算法。通过实例分析和Python代码实现,展示了感知机的应用过程。研究证明感知机在线性可分条件下收敛,但无法解决非线性问题(如异或)。最后,文章指出感知机是神经网络的基础,具有重要的理论价值。

更多推荐