1. 感知机
感知机是一个二分类的线性模型,它通过构造一个超平面,将特征空间中的样本分为两类。感知机的核心思想是找到一个超平面,使得不同类别的样本可以通过该超平面分开,适用于线性可分的数据集。
优点:
- 实现简单,易于理解和实现。
- 在处理线性可分数据集时具有良好的表现。
缺点:
- 仅适用于线性可分数据集,对线性不可分数据无能为力。
- 容易受噪声数据影响,可能导致学习困难。
- 学习率的选择对收敛速度和效果有较大影响。
其他算法的对比:
- 与SVM的对比:
- 感知机与SVM都可以用于二分类任务,但SVM引入了间隔的概念,优化目标是最大化分类间隔,从而具有更好的泛化能力。
- 感知机没有惩罚项,容易过拟合,而SVM通过加入惩罚项来平衡间隔与误分类的权衡。
- 与逻辑回归的对比:
- 感知机使用的是硬分类,即直接将结果映射到-1或+1,而逻辑回归是基于概率的软分类模型,输出一个概率值,再根据阈值进行分类。
- 逻辑回归的损失函数是对数损失,而感知机没有明确的损失函数,这使得逻辑回归在处理噪声数据时更为鲁棒。
1.1 基本原理
感知机的基本思路是基于输入特征的线性组合进行分类。感知机模型可以表示为:
模型:
f
(
x
)
=
sign
(
w
⋅
x
+
b
)
\begin{align}f(\mathbf{x}) = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b)\end{align}
f(x)=sign(w⋅x+b)
其中,
w
\mathbf{w}
w 是权重向量,
x
\mathbf{x}
x 是输入特征向量,
b
b
b 是偏置项,
sign
\text{sign}
sign 是符号函数,其中符号函数定义为:
sign
(
x
)
=
{
1
if
x
≥
0
−
1
if
x
<
0
\begin{align}\text{sign}(x) = \begin{cases} 1 & \text{if } x \geq 0 \\ -1 & \text{if } x < 0 \end{cases}\end{align}
sign(x)={1−1if x≥0if x<0
决策边界:决策边界是由
w
⋅
x
+
b
=
0
\mathbf{w} \cdot \mathbf{x} + b = 0
w⋅x+b=0 决定的超平面。
输出:感知机的输出为 +1 或 -1 ,表示对样本的分类结果。
1.2 损失函数
感知机的目标是找到一个超平面,使得所有样本的分类错误最小。为了衡量模型的性能,定义损失函数。传统的二分类损失函数(误分类点数)对权重
w
\mathbf{w}
w 和偏置
b
b
b 的梯度计算不连续,不适合优化。因此,采用基于误分类点到超平面的总距离的损失函数:
L
(
w
,
b
)
=
−
1
∥
w
∥
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
\begin{align}L(\mathbf{w}, b) = -\frac{1}{\|\mathbf{w}\|} \sum_{x_i \in M} y_i (\mathbf{w} \cdot x_i + b)\end{align}
L(w,b)=−∥w∥1xi∈M∑yi(w⋅xi+b)
其中:
- ∥ w ∥ \|\mathbf{w}\| ∥w∥ 是权重向量的范数。
- x i x_i xi 是第 i i i 个样本。
- y i y_i yi 是第 i i i 个样本的真实标签(-1 或 1)。
1.3 学习算法
感知机的优化目标是最小化误分类样本的数量。通过调整权重 w \mathbf{w} w 和偏置 b b b,感知机的学习过程逐步减少误分类样本,直到达到预期的分类效果。常用的方法是梯度下降法,梯度下降法通过迭代更新参数 w \mathbf{w} w 和 b b b 来找到最优解。具体步骤如下:
- 初始化:
将权重向量 w \mathbf{w} w 和偏置 b b b 初始化为零向量或随机小值。
- 遍历数据:
对于每个训练样本
(
x
i
,
y
i
)
(\mathbf{x}_i, y_i)
(xi,yi),计算预测值:
y
i
′
=
sign
(
w
⋅
x
i
+
b
)
\begin{align} y'_i = \text{sign}(\mathbf{w} \cdot \mathbf{x}_i + b)\end{align}
yi′=sign(w⋅xi+b)
- 误分类检查与更新:
如果
y
i
′
≠
y
i
y'_i \neq y_i
yi′=yi(即发生误分类),则根据以下更新规则调整参数:
梯度计算:计算损失函数
L
(
w
,
b
)
L(\mathbf{w}, b)
L(w,b) 对权重
w
\mathbf{w}
w 和偏置
b
b
b 的梯度:
∇
w
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
∇
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
\begin{align}\nabla_{\mathbf{w}} L(\mathbf{w}, b) = -\sum_{\mathbf{x}_i \in M} y_i \mathbf{x}_i \\ \nabla_b L(\mathbf{w}, b) = -\sum_{\mathbf{x}_i \in M} y_i\end{align}
∇wL(w,b)=−xi∈M∑yixi∇bL(w,b)=−xi∈M∑yi
其中,
M
M
M 表示所有误分类样本的集合。
梯度下降更新规则:使用梯度下降法更新权重和偏置:
w
←
w
+
η
∑
x
i
∈
M
y
i
x
i
b
←
b
+
η
∑
x
i
∈
M
y
i
\begin{align}\mathbf{w} \leftarrow \mathbf{w} + \eta \sum_{\mathbf{x}_i \in M} y_i \mathbf{x}_i\\ b \leftarrow b + \eta \sum_{\mathbf{x}_i \in M} y_i \end{align}
w←w+ηxi∈M∑yixib←b+ηxi∈M∑yi
其中,
η
\eta
η 是学习率,控制每次更新的步长。
- 迭代过程:
重复以上步骤,直到没有误分类样本或达到最大迭代次数。
1.4 梯度下降法
根据梯度下降法的推导过程:
- 泰勒展开:梯度下降的基本思路是沿着梯度的反方向更新参数,以最小化目标函数。对于函数 f ( θ ) f(\theta) f(θ),其泰勒展开为:
f ( θ ) = f ( θ k ) + ( θ − θ k ) ∇ f ( θ k ) \begin{align}f(\theta) = f(\theta^k) + (\theta - \theta^k) \nabla f(\theta^k)\end{align} f(θ)=f(θk)+(θ−θk)∇f(θk)
- 方向向量:令 θ − θ k = v ⋅ η \theta - \theta^k = v \cdot \eta θ−θk=v⋅η,其中 v v v 是方向向量, η \eta η 是步长系数。为了保证沿梯度下降方向,必须有:
f ( θ ) − f ( θ k ) = v ⋅ η ∇ f ( θ k ) < 0 \begin{align}f(\theta) - f(\theta^k) = v \cdot \eta \nabla f(\theta^k) < 0\end{align} f(θ)−f(θk)=v⋅η∇f(θk)<0
- 更新公式:因此,方向向量 v v v 应与梯度 ∇ f ( θ k ) \nabla f(\theta^k) ∇f(θk) 方向相反,可以表示为:
v
=
−
∇
f
(
θ
k
)
∣
∇
f
(
θ
k
)
∣
\begin{align}v = -\frac{\nabla f(\theta^k)}{|\nabla f(\theta^k)|}\end{align}
v=−∣∇f(θk)∣∇f(θk)
更新参数的公式为:
θ
=
θ
k
−
∇
f
(
θ
k
)
∣
∇
f
(
θ
k
)
∣
η
\begin{align}\theta = \theta^k - \frac{\nabla f(\theta^k)}{|\nabla f(\theta^k)|} \eta\end{align}
θ=θk−∣∇f(θk)∣∇f(θk)η
1.5 代码实现
感知机训练的伪代码如下:
def perceptron_train(X, y, eta=0.01, epochs=1000):
# 初始化权重和偏置
w = np.zeros(X.shape[1])
b = 0
for epoch in range(epochs):
errors = 0
# 每个epoch前随机打乱数据顺序
indices = np.random.permutation(len(y))
for i in indices:
xi, yi = X[i], y[i]
# 如果预测错误
if yi * (np.dot(xi, w) + b) <= 0:
w += eta * yi * xi
b += eta * yi
errors += 1
# 如果没有误分类样本,提前停止训练
if errors == 0:
break
return w, b