Python与机器学习实战——感知器

感知器

感知器只能处理线性可分的问题,所谓线性可分问题就是:对于一个数据集 D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),...,(x_n,y_n)\} D={(x1,y1),...,(xn,yn)},其中 x i ∈ X ⊆ R n , y i ∈ { − 1 , + 1 } x_i\in \bold{X}\subseteq\mathbb{R^n} ,y_i\in\{-1,+1\} xiXRn,yi{1,+1}.如果存在一个超平面 Π \Pi Π能够将D中的正负样本点精确地划分到 Π \Pi Π的两侧,即:
∃ Π : w ⋅ x + b = 0 \exist\Pi:w·x+b=0 Π:wx+b=0使得:
w ⋅ x i + b < 0 ( ∀ y i = − 1 ) w ⋅ x i + b > 0 ( ∀ y i = + 1 ) w·x_i+b<0(\forall y_i=-1)\\w·x_i+b>0(\forall y_i=+1) wxi+b<0(yi=1)wxi+b>0(yi=+1) n = 2 n=2 n=2,也就是数据集可以被一条直线精确划分到两边。当 n = 3 n=3 n=3表示,数据集能被一个三维空间的平面精确划分开。对于一个数学问题,找一个超平面不是一个很好的描述,可以把这个问题转化为一个损失函数最小化的过程。考虑到 Π \Pi Π的特性,损失函数的定义非常简单:
L ( w , b , x , y ) = − ∑ x i ∈ E y i ( w ⋅ x i + b ) \mathbb{L(w,b,x,y)}=-\sum_{x_i\in E}y_i(w·x_i+b) L(w,b,x,y)=xiEyi(wxi+b)这里E是当前被误分类的点集,即 ∃ x i ∈ E \exist x_i\in E xiE:
w ⋅ x i + b ⩾ 0 , i f ( y i = − 1 ) w ⋅ x i + b ⩽ 0 , i f ( y i = + 1 ) w·x_i+b\geqslant0,if(y_i=-1)\\w·x_i+b\leqslant0,if(y_i=+1) wxi+b0,if(yi=1)wxi+b0,if(yi=+1)所以损失函数也可以写成:
L ( w , b , x , y ) = ∑ x i ∈ E ∣ w ⋅ x i + b ∣ \mathbb{L(w,b,x,y)}=\sum_{x_i\in E}|w·x_i+b| L(w,b,x,y)=xiEwxi+b ∣ w ⋅ x i + b ∣ |w·x_i+b| wxi+b能相对地表示向量 x i x_i xi到超平面 w ⋅ x i + b = 0 w·x_i+b=0 wxi+b=0的距离,损失函数的几何解释就是:损失函数值=所有被误分类样本点到超平面的距离和。如果超平面将所有的样本点正确分类,那么损失函数值就是0。

感知器的损失函数最小化使用的是梯度下降法。简单来用随机梯度下降法来说明一下:
∂ L ( w , b , x i , y i ) ∂ w = { 0 , ( x i , y i ) ∉ E − y i x i , ( x i , y i ) ∈ E ∂ L ( w , b , x i , y i ) ∂ b = { 0 , ( x i , y i ) ∉ E − y i , ( x i , y i ) ∈ E \begin{array}{c}\frac{\partial L(w,b,x_i,y_i)}{\partial w}=\left\{\begin{array}{l}\begin{array}{cc}0,&(x_i,y_i)\not\in E\end{array}\\\begin{array}{cc}-y_ix_i,&(x_i,y_i)\in E\end{array}\end{array}\right.\\\frac{\partial L(w,b,x_i,y_i)}{\partial b}=\left\{\begin{array}{l}\begin{array}{cc}0,&(x_i,y_i)\not\in E\end{array}\\\begin{array}{cc}-y_i,&(x_i,y_i)\in E\end{array}\end{array}\right.\end{array} wL(w,b,xi,yi)={0,(xi,yi)Eyixi,(xi,yi)EbL(w,b,xi,yi)={0,(xi,yi)Eyi,(xi,yi)E所以感知器算法的流程
输入: 训练集 D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),...,(x_n,y_n)\} D={(x1,y1),...,(xn,yn)},迭代次数M,学习率 α \alpha α,其中: x i ∈ X ⊆ R n , y i ∈ { − 1 , + 1 } x_i\in \bold{X}\subseteq\mathbb{R^n} ,y_i\in\{-1,+1\} xiXRn,yi{1,+1}(1) 初始化参数:
w = ( 0 , . . . , 0 ) T ∈ R N , b = 0 w=(0,...,0)^T\in \mathbb{R^N},b=0 w=(0,...,0)TRN,b=0(2)对 j = 1 , . . . , M j=1,...,M j=1,...,M:
E = { ( x i , y i ) ∣ y i ( w ⋅ x i + b ) ⩽ 0 } E=\{(x_i,y_i)|y_i(w·x_i+b) \leqslant 0\} E={(xi,yi)yi(wxi+b)0}(a)若 E = ∅ E=\empty E=,表示没有错误分类,退出
(b)否则,任取E中的一个样本点 ( x i , y i ) (x_i,y_i) (xi,yi)并利用他更新参数:
w ← w + α y i x i b ← b + α y i w\leftarrow w+\alpha y_ix_i\\b\leftarrow b+\alpha y_i ww+αyixibb+αyi输出:感知器模型 g ( x ) = s i g n ( f ( x ) ) = s i g n ( w ⋅ x + b ) g(x)=sign(f(x))=sign(w·x+b) g(x)=sign(f(x))=sign(wx+b)
算法中最核心的就是梯度下降过程:
w ← w + α y i x i b ← b + α y i w\leftarrow w+\alpha y_ix_i\\b\leftarrow b+\alpha y_i ww+αyixibb+αyi我们可以将参数表示为样本点的线性组合,假设样本点 ( x i , y i ) (x_i,y_i) (xi,yi)在处理过程中被使用了 n i n_i ni次(初始化: w = ( 0 , . . . , 0 ) T ∈ R N , b = 0 w=(0,...,0)^T\in \mathbb{R^N},b=0 w=(0,...,0)TRN,b=0),那么:
w = α ∑ i = 1 N n i y i x i b = α ∑ i = 1 N n i y i w=\alpha\sum_{i=1}^Nn_iy_ix_i\\b=\alpha\sum_{i=1}^Nn_iy_i w=αi=1Nniyixib=αi=1Nniyi进一步假设 α i = α n i \alpha_i=\alpha n_i αi=αni,所以:
w = ∑ i = 1 N α i y i x i b = ∑ i = 1 N α i y i w=\sum_{i=1}^N\alpha_iy_ix_i\\b=\sum_{i=1}^N\alpha_iy_i w=i=1Nαiyixib=i=1Nαiyi这就是感知器的对偶算法:
输入:训练集 D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),...,(x_n,y_n)\} D={(x1,y1),...,(xn,yn)},迭代次数M,学习率 α \alpha α,其中: x i ∈ X ⊆ R n , y i ∈ { − 1 , + 1 } x_i\in \bold{X}\subseteq\mathbb{R^n} ,y_i\in\{-1,+1\} xiXRn,yi{1,+1}(1) 初始化参数:
α = ( α 1 , . . . , α N ) T = ( 0 , . . . , 0 ) T ∈ R N \alpha=(\alpha_1,...,\alpha_N)^T=(0,...,0)^T\in \mathbb{R^N} α=(α1,...,αN)T=(0,...,0)TRN(2)对 j = 1 , . . . , M j=1,...,M j=1,...,M:
E = { ( x i , y i ) ∣ y i ( ∑ k = 1 N α k y k ( x k ⋅ x i + 1 ) ) ⩽ 0 } E=\{(x_i,y_i)|y_i(\sum_{k=1}^N\alpha_ky_k(x_k·x_i+1))\leqslant 0\} E={(xi,yi)yi(k=1Nαkyk(xkxi+1))0}(a)若 E = ∅ E=\empty E=,表示没有错误分类,退出
(b)否则,任取E中的一个样本点 ( x i , y i ) (x_i,y_i) (xi,yi)并利用他更新参数:
α i ← α i + 学 习 率 \alpha_i\leftarrow\alpha_i+学习率 αiαi+输出:感知器模型 g ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ k = 1 N α k y k ( x k ⋅ x i + 1 ) ) g(x)=sign(f(x))=sign(\sum_{k=1}^N\alpha_ky_k(x_k·x_i+1)) g(x)=sign(f(x))=sign(k=1Nαkyk(xkxi+1))对偶形式里面,样本 x x x仅以内积 ( x k ⋅ x i ) (x_k·x_i) (xkxi)的形式出现,在训练过程中,会重复大量使用到样本点之间的内积,通常可以将内积计算并存储在一个矩阵中,也就是Gram矩阵:
G = ( x k ⋅ x i ) N × N G=(x_k·x_i)_{N\times N} G=(xkxi)N×N

你可能感兴趣的:(机器学习)