这本书介绍的第一个模型就是感知机(perceptron),这是一种针对二类分类建立的模型,输入样本的特征向量,输出预测该样本在二类中的类别。
完成这个思想的方法是,把样本的特征向量看成n维空间(样本有几个特征,就反映在几维空间)里的点,然后找到一个该空间的超平面,将样本点进行划分。找到这个超平面的问题有原始形式和对偶形式。
完全的定义在书上有,这里省略一些细节。
主要用来输出预测的模型是:
f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w \cdot x +b) f(x)=sign(w⋅x+b)
其中, s i g n ( x ) sign(x) sign(x)函数是一个类似示性函数 I ( x ) I(x) I(x)的函数
f ( x ) = { + 1 , x≥0 − 1 , x<0 f(x)=\left\{ \begin{aligned} +1 & \text{ , x≥0} \\ -1 & \text{ , x<0}\\ \end{aligned} \right. f(x)={+1−1 , x≥0 , x<0
w w w是和特征个数相同的n维向量, b b b是一个标量,这是后面建立分离超平面的参数。
感知机有一个几何解释,建立的线性方程:
w ∗ x + b = 0 w*x+b=0 w∗x+b=0
是特征空间 R n R^n Rn中的一个超平面,其中 w w w是该超平面的法向量, b b b是超平面的截距,表征了超平面离原点的偏离(比如三维空间中,不同的b代表了纵向上变化量,即z轴变化量)。
这个超平面将训练集中的样本分为两部分,即完成了感知机模型的建立。
对给定的数据集,如果存在一个超平面能够将数据集的两类实例点完全的分离开,就称这个数据集是线性可分的数据集,否则就不可分。
这个要求主观上就是要求数据中的干扰项或者说异常值较少,少到没有能被误分的程度,其实蛮严格的。
感知机的学习策略就是将定义的损失函数降到最低,也就是把“错误率”降到最低。我们会自然的想到用误分类的点数去定义这个损失函数,但是这是个离散的函数值,每个点都不可导,不能用求导的方法求极值去优化,所以我们用的是误分类点到平面的总距离(实际上在后续计算也没有用到距离)。
(这里为什么只用了误分类点没有用全体点呢?
第一、不论用全体点正确与否,在大数量级的数据面前,用全体点求到平面距离的工作量是非常庞大的。
第二、对感知机来说,我们只用去关注被误分类的样本,其余已经分类好了的点,我们不用再次关注他们的距离,距离问题是在后面章节支持向量机求唯一超平面时候才考虑。现在只要能找到所有能较好分割样本点的超平面其中的一个就OK)
首先,我们用点到平面的距离公式: 丨 w ⋅ x i + b 丨 w T w \frac{丨w\cdot x_{i}+b丨}{\sqrt{w^{T}w}} wTw丨w⋅xi+b丨
其中的 w T w w^{T}w wTw其实就是 w w w每个分量的平方和,在开方,就是 w w w在该维的范数。 w ∗ x i + b w*x_{i}+b w∗xi+b带入 x i x_{i} xi后可以通过正负来判断这个点是否和法向量在同侧。如果假设法向量一侧都是正例,那么可以用 − y i ∗ ( w ∗ x i + b ) -y_{i}*(w*x_{i}+b) −yi∗(w∗xi+b)的符号来鉴别有没有正确分类。预测值和实际值 y i y_{i} yi如果在同侧,也即同号,则整个式子为负。当式子为正的时候,也就说这个样本点被误分类了。
假设模型中误分类点的集合为 M M M:
则所有误分类点到超平面的距离为
− 1 w T w ∗ ∑ x i ∈ M y i ∗ ( w ⋅ x i + b ) -\frac{1}{\sqrt{w^{T}w}}*\sum_{x_{i}\in M}{y_{i}*(w\cdot x_{i}+b)} −wTw1∗xi∈M∑yi∗(w⋅xi+b)
这个就是感知机模型的经验风险函数(经验指:这是通过已有的样本,也就是我们的“经验”判断的风险。)我们的目的就是寻找这个式子取最小值时的 w 和 b w 和 b w和b。
感知机模型现在可以叙述为:
给定数据集 ( x i , y i ) , i = 1 , 2 , 3 , 4 , 5 , 6 … … n (x_{i},y_{i}),i = 1,2,3,4,5,6……n (xi,yi),i=1,2,3,4,5,6……n之后
(其中 x i x_{i} xi是样本的特征向量,每个分量代表了各特征取值, y i y_{i} yi是样本实际观测下来的类别值)
求损失函数极小化的解
min L ( w , b ) = min − 1 w T w ∗ ∑ x i ∈ M y i ∗ ( w ⋅ x i + b ) \min L(w,b) = \min -\frac{1}{\sqrt{w^{T}w}}*\sum_{x_{i}\in M}{y_{i}*(w\cdot x_{i}+b)} minL(w,b)=min−wTw1∗xi∈M∑yi∗(w⋅xi+b)
在计算中,先设定初始的超平面参数 w 0 , b 0 w_{0},b_{0} w0,b0然后随机选择一个误分类点让两个参数梯度下降。
如果误分类点 M M M是固定的(实际每次调整参数, M M M都会变动),那么下降的梯度就是:
▽ w L ( w , b ) = − ∑ x i ∈ M y i x i ▽ b L ( w , b ) = − ∑ x i ∈ M y i \bigtriangledown_{w}L(w,b) = - \sum_{x_{i}\in M}{y_{i}}x_{i}\\ \bigtriangledown_{b}L(w,b) = - \sum_{x_{i}\in M}{y_{i}} ▽wL(w,b)=−xi∈M∑yixi▽bL(w,b)=−xi∈M∑yi
(注意一下这个地方的求和号,表示是总下降梯度,不是逐次下降梯度,在后面对偶问题还会再次出现。)
在 M M M中,随机选择一个误分类点 ( x i , y i ) (x_{i},y_{i}) (xi,yi),对现有的 w 和 b w和b w和b进行更新
w ← w + η y i x i b ← b + η y i w \gets w+\eta y_{i}x_{i}\\ b \gets b+\eta y_{i} w←w+ηyixib←b+ηyi
注意两个点:
1.其中的 η ∈ ( 0 , 1 ] \eta \in (0,1] η∈(0,1]是步长,代表了每次更新的幅度大小。
2.其中的 y i y_{i} yi是标量,+1和-1,不要和后面的特征向量数据格式搞混了。
这样通过不停地迭代计算,损失函数就会不断减少,直至为零,得到最终的模型参数。
所以得到如下算法
1.选取初值 w 0 , b 0 w_{0},b_{0} w0,b0
2.在误分类点中随机选取数据 ( x i , y i ) (x_{i},y{i}) (xi,yi)
3.更新两个参数 w , b w,b w,b
4.重复2-3步骤,直到误分类点为零。
从几何直观上,这中反复操作相当于,找到一个误分类点,然后将超平面朝这个误分类点的方向移动一步,直到越过它,将它正确分类。
例子在书中有称述
这里有一个定理,证明在书中,也不赘述了。
1.存在满足条件 w T w = 1 \sqrt{w^{T}w}=1 wTw=1(单位化)的超平面将训练数据集完全分开,且存在 γ > 1 \gamma>1 γ>1
注:这里定义了新的超平面方程
w ^ ⋅ x i ^ = 0 其 中 w ^ = ( w 0 , w 1 , … … , b ) x i ^ = ( x 1 , x 2 , … … , 1 ) \hat{w} \cdot \hat{x_{i}}=0\\其中\hat{w} = (w_{0},w_{1},……,b)\\\hat{x_{i}}=(x_{1},x_{2},……,1) w^⋅xi^=0其中w^=(w0,w1,……,b)xi^=(x1,x2,……,1)
这个新形式更加紧凑,其实就是两个向量內积。
2.令 R = m a x 1 ≤ i ≤ N x ^ i T ⋅ x ^ i R = max_{1≤i≤N}\sqrt {\hat{x}_{i}^{T}\cdot\hat{x}_{i}} R=max1≤i≤Nx^iT⋅x^i,即最大的一个 x ^ i \hat {x}_{i} x^i的內积,则在训练集上,感知机算法的误分类次数k满足不等式 k ≤ ( R γ ) 2 k≤(\frac{R}{\gamma})^{2} k≤(γR)2
在原始形式里,我们通过样本点直接去迭代求解 w , b w,b w,b,而在对偶形式中,我们将 w 和 b w和b w和b,表示为 x i , y i x_{i},y_{i} xi,yi的线性组合形式,再通过求解线性组合的系数,最终得出 w 和 b w和b w和b。这和原始形式的区别就是,原始形式是选一个点,更新一次,再选一个点,更新第二次。对偶形式采取的策略是,把对所有误分点将要进行的数据更新累加在一起,最后一起更新一次。在这之中有些误分点可能会多次采用,所以引进 n i n_{i} ni,表征第 i i i个样本总共被调用了几次。
在原始形式的算法中,设定初试值 w 0 和 b 0 w_{0}和b_{0} w0和b0,然后选择误分类点,通过
w ← w + η y i x i b ← b + η y i w \gets w+\eta y_{i}x_{i}\\ b \gets b+\eta y_{i} w←w+ηyixib←b+ηyi
逐步的修改 w 和 b w和b w和b,设从开始到最后得到模型,我们因为某个误分类点 ( x i , y i ) (x_{i},y_{i}) (xi,yi)一共修改了 n i n_{i} ni次,则对于这个误分类点,两个参数 w , b w,b w,b的总增量是 n i η n_{i}\eta niη,令 n i η = α i n_{i}\eta=\alpha_{i} niη=αi。则最终学习到的参数为: w = ∑ i = 1 N α i x i y i b = ∑ i = 1 N α i y i w = \sum_{i = 1}^{N}\alpha_{i}x_{i}y_{i}\\ b = \sum_{i = 1}^{N}\alpha_{i}y_{i} w=i=1∑Nαixiyib=i=1∑Nαiyi综上,我们总结对偶形式的算法为:
建立感知机模型对偶形式 f ( x ) = s i g n ( ∑ j = 1 N α j x j y j ⋅ x + b ) f(x)=sign(\sum_{j = 1}^{N}\alpha_{j}x_{j}y_{j}\cdot x +b) f(x)=sign(∑j=1Nαjxjyj⋅x+b)
注:实际上,这里将原始问题中的 w w w替换成了 x j 和 y j x_{j}和y_{j} xj和yj的线性组合,其组合中每一项的系数为 α j \alpha_{j} αj。
1.设置初始值 α 和 b \alpha 和 b α和b
2.在误分类点中选择数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi)
3.更新数据:
α i ← α i − 1 + η b ← b + η y i \alpha_{i} \gets \alpha_{i-1}+\eta\\ b\gets b+\eta y_{i} αi←αi−1+ηb←b+ηyi
4.重复2-3步骤,直至没有误分类点为止。
那么采用对偶形式的模型有什么好处呢?
在原始问题中,我们每一次更新参数,都需要调用整个样本点的信息,而在对偶形式中,在更新参数时,只需要计算內积 x i T x j , i , j = 1 , 2 , 3 , 4.... N x_{i}^{T}x_{j},i,j=1,2,3,4....N xiTxj,i,j=1,2,3,4....N
这是一个数,这样的处理就降低了计算复杂程度。我们就可以在拟合模型之前,计算出每个样本的特征向量和其他样本特征向量的內积,储存在一个矩阵中,在将来更新参数的时候方便调用。
故我们定义Gram矩阵:
G = [ x i ⋅ j i ] N × N G = [x_{i}\cdot j_{i}]_{N \times N} G=[xi⋅ji]N×N方便之后调用內积来更新参数。
自此感知机模型基础介绍完毕,后期会更新python实现部分。