感知机与对偶算法:基础与应用
感知机是一种线性二分类模型,最早由Rosenblatt在1957年提出。本文将介绍感知机的基本原理、原感知机算法以及其对偶算法。
1.感知机模型
(1)模型:
感知机模型是一种简单的线性分类模型,其核心思想是找到一个能够将数据分为两个类别的超平面。具体来说,感知机模型通过一个线性函数和一个阈值来实现分类:
f
(
x
)
=
y
i
(
w
⋅
x
+
b
)
f(x) = y_i(\mathbf{w} \cdot \mathbf{x} + b)
f(x)=yi(w⋅x+b)
其中,
w
w
w是权重向量,
x
x
x 是输入特征向量,
b
b
b 是偏置项。感知机的目标是找到一个权重向量和偏置项,使得:
- 对于正类样本 y i = 1 y_i=1 yi=1,有 w ⋅ x i + b ≥ 0 \mathbf{w} \cdot \mathbf{x}_i + b \geq 0 w⋅xi+b≥0
- 对于负类样本 y i = − 1 y_i=-1 yi=−1,有 w ⋅ x i + b < 0 \mathbf{w} \cdot \mathbf{x}_i + b < 0 w⋅xi+b<0
(2)策略:没有误分类点
m i n w , b L ( w , b ) = − ∑ x ϵ M y i ( w ⋅ x i + b ) \underset{w,b}{min}L\left( w,b \right) =-\sum_{x\epsilon M}{y_i}\left( w·x_i+b \right) w,bminL(w,b)=−xϵM∑yi(w⋅xi+b)
(3)算法:原始算法与对偶算法
2.原感知机算法
原感知机算法是一种基于梯度下降的算法,通过不断调整权重和偏置来最小化分类误差。其基本步骤如下:
输入:训练数据集T={
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
N
,
y
N
)
(x_1,y_1),(x_2,y_2),…,(x_N,y_N)
(x1,y1),(x2,y2),…,(xN,yN)};
y
i
y_i
yi={+1,-1};
学习率
(
0
<
η
<
=
1
)
(0<\eta<=1)
(0<η<=1)
输出:
w
w
w,
b
b
b;感知机模型
f
(
x
)
=
y
i
(
w
⋅
x
+
b
)
f(x) = y_i(w·x+b)
f(x)=yi(w⋅x+b)
-
初始化:随机初始化权重 w 0 w_0 w0和偏置 b 0 b_0 b0。
-
迭代:对于每一轮迭代:
- 遍历所有训练样本 x i x_i xi。
- 如果
y
i
(
w
⋅
x
i
+
b
)
<
1
y_i (w ·{x_i}+ b) < 1
yi(w⋅xi+b)<1,则更新权重和偏置:
w
←
w
+
η
y
i
x
i
\mathbf{w} \leftarrow \mathbf{w} + \eta y_i \mathbf{x}_i
w←w+ηyixi,
b
←
b
+
η
y
i
b \leftarrow b + \eta y_i
b←b+ηyi。
其中, η \eta η是学习率。
-
收敛:当所有样本都被正确分类或达到最大迭代次数时,算法停止。
-
代码及可视化
x_eg1 =np.array([[1,2], [2,3], [3,1],[4,2]])
y = np.array([1,1,-1,-1])
plt.scatter(x_eg1[:,0],x_eg1[:,1],c=y)
def perception_normal(x_trian, y,w,b,n = 1000,eta=1.0):
m = len(x_trian)
i = 0
while i < n:
k = i
for j in range(m):
juge = y[j]*(np.dot(x_trian[j,:],w)+b)
if juge <= 0:
i += 1
w = w + y[j]* x_trian[j,:]*eta
b = b + y[j]*eta
break
if i == k:
break
if i-k != 0:
print("even n is equal to " +str(n) +",the work is still not well done")
return w,b,[i]
#感知机的输出结果与初始参数有关
W = [[w,b],[w+[0,10],b+2]]
for i in W:
plot_perception(x_eg1,y,i[0],i[1],n=1000)
3.对偶算法
对偶算法是感知机的一种变体,它通过最大化两个类别之间的间隔来找到最优的权重和偏置。对偶算法的核心思想是将原始问题转化为对偶问题,从而简化计算。
-
拉格朗日乘子法:首先将原始问题转化为拉格朗日形式:
L ( w , b , α ) = − ∑ i = 1 m α i y i ( w ⋅ x i + b ) + λ ( ∥ w ∥ 2 + b 2 ) L(\mathbf{w}, b, \alpha) = -\sum_{i=1}^m \alpha_i y_i (\mathbf{w} \cdot \mathbf{x}_i + b) + \lambda (\|\mathbf{w}\|^2 + b^2) L(w,b,α)=−i=1∑mαiyi(w⋅xi+b)+λ(∥w∥2+b2) 其中, α i \alpha_i αi是拉格朗日乘子, λ \lambda λ是正则化项。 -
求解对偶问题:通过求解对偶问题来找到最优的 α \alpha α:
min α max w , b L ( w , b , α ) \min_{\alpha} \max_{\mathbf{w}, b} L(\mathbf{w}, b, \alpha) minαmaxw,bL(w,b,α) -
更新权重和偏置:最终的权重和偏置可以通过以下公式计算:
w = ∑ i = 1 m α i y i x i \mathbf{w} = \sum_{i=1}^m \alpha_i y_i \mathbf{x}_i w=∑i=1mαiyixi, b = 1 η ∑ i = 1 m α i y i − ∥ w ∥ 2 2 η b = \frac{1}{\eta} \sum_{i=1}^m \alpha_i y_i - \frac{\|\mathbf{w}\|^2}{2 \eta} b=η1∑i=1mαiyi−2η∥w∥2 -
代码和可视化:
def perception_dual(x_trian, y,a,b,n = 1000,eta=1.0):
m = len(x_trian)
Gram = np.dot(x_trian,x_trian.T)
i = 0
while i < n:
k = i
for j in range(m):
juge = y[j]*(a * y @Gram[j]+b)
if juge <= 0:
i += 1
a[j] += eta
b += y[j]*eta
break
if i == k:
break
if i-k != 0:
print("even if n is equal to " +str(n) +",the work is still not well done")
weight = a * y @ x_trian
return weight,b,[i]
讨论和感知机优缺点
- 讨论:XOR 数据集是否可以实现划分
XOR(异或)数据集是一个经典的二元分类问题,其特点是数据点在特征空间中不是线性可分的。具体来说,XOR问题涉及两个二进制输入特征,其输出根据输入的异或结果确定。例如:
(1,2)→1 (2,3)→-1
(4,2)→1 (3,1)→-1
even n is equal to 2,the work is still not well done
- 优缺点:
- 优点
简单直观:感知机模型和算法相对简单,容易理解和实现。
历史意义:感知机是机器学习领域的早期模型之一,对后续模型的发展有重要影响。
快速训练:对于线性可分的数据集,感知机算法通常能够快速收敛。 - 缺点
非线性限制:感知机只能处理线性可分的数据集,对于非线性问题,如XOR,无法实现完美划分。
参数选择:学习率和迭代次数的选择对模型性能有显著影响,需要仔细调整。
局部最优:感知机算法容易陷入局部最优解,尤其是在数据集复杂或噪声较多的情况下。