感知机2 -- 随机梯度下降算法
声明:
1,本篇为个人对《2012.李航.统计学习方法.pdf》的学习总结。不得用作商用,欢迎转载,但请注明出处(即:本帖地址)。
2,因为本人在学习初始时有非常多数学知识都已忘记。因此为了弄懂当中的内容查阅了非常多资料。所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我。我会将您的帖子的地址付到以下。
3,假设有内容错误或不准确欢迎大家指正。
4,假设能帮到你,那真是太好了。
概述
随意选取一超平面w0、b0,然后用随机梯度下降算法不断极小化L(w, b)。
Ps: 极小化的过程不是一次使M中的全部误分类点的梯度下降,而是随机选取一个误分类点使其梯度下降。
过程概述
1,对于L(w, b) = -yi(w·xi+ b)。L(w, b)的梯度例如以下:
▽w L(w, b) = - yixi
▽b L(w, b) =- yi
2,随机选取一个误分类点(xi, yi),对w,b更新:
w= w + ηyixi
b= b + ηyi
(η为步长。在统计学习中又称学习率)
这样,通过迭代能够期待L(w,b)不断下降,直到为0。
算法的第一种形式(感知机算法的原始形式)
输入:
训练数据集 T={(x1,y1),(x2,y2),...,(xn,yn)},当中x1∈Rn,yi={+1,-1},i=1, 2, ..., n,学习率η(0 < η<= 1)
输出:
w, b。感知机模型 f(x) = sign(w·x + b)
过程:
1, 选取初值w, b
2, 在训练集中取数据(xi,yi)
3。 若 yi(w·xi+ b) <= 0 即分类不对。则:
w= w + ηyixi
b= b + ηyi
注:由于此时分类不正确,所以yi= -1
4, 转至步骤2,直到训练数据集中无误分类点
总结:
直观上解释上面的过程就是:若一个实例点被误分类,即:位于超平面的错误一側时,需调整w, b 的值,使分离超平面向该误分类点的一側移动。以降低该误分类点与超平面的距离。直至超平面越过该误分类点使其被正确分类。
例:
输入:
训练数据集 x1= (3, 3)。x2 = (4, 3),为正实例点(被正确分类)。x3 = (1, 1)为负实例点
求:
f(x)= sign(w·x + b)
ps:这里的w = (w(1),w(2)),x = (x(1), x(2))
解:
1。 令η=1,并取初值w0 = 0, b0= 0
2, 对x1= (3, 3)。yi(w·xi + b) = 0,未能被正确分类,因此更新w, b
w = w + ηy1x1 = (3, 3)
b= b + ηy1 = 1
获得线性模型:w·x + b = 3x(1) + 3x(2) + 1
3, 检查该线性模型:
对于x1和x2,∵正确分类,∴不改动w,b
对于x3= (1, 1)。∵y3(w·x3 + b) < 0。∴被误分类,∴须要改动w, b
到此说明下: a。 上面出现的yi不是f(x) = w·x + b的f(x),而是代表某个点xi是否被正确分类的值: 正确分类 :yi = 1 不对分类:yi = -1 所以。y1 = 1, y2 = 1, y3 = -1 所以,在上面的第三步中 对x1 和 x2: yi(w·xi + b) = 1*(3xi(1) + 3xi(2) + 1) > 0,被正确分类 对x3: y3(w·x3 + b) = -1*(3x3(1) + 3x3(2) + 1) = -1*(3*1 + 3*1 + 1) < 0,未被正确分类 b。 既然yi不是f(x),那y坐标用什么表示? 答案是: xi(1) 表示xi点的x坐标 xi(2) 表示xi点的y坐标 c。 w·x1为内积 于是对于w = (0, 0),x1 = (3, 3): w·x1 = 0*3 + 0*3 = 0 |
继续第三步,更新w, b:
w = w + ηy3x3 = (3, 3) + -1 * (1, 1) = (2, 2)
b= b + ηy3 = 1 + -1 = 0
于是,线性模型更新为:
w·x + b = 2x(1)+ 2x(2)
4。 迭代上述过程,直到:
w = (1, 1),b = -3
即,线性模型为:
x(1)+ x(2) – 3
此时对全部的点均有yi(w·xi+ b) > 0。无误分类点,于是损失函数达到最小。
终于求得:
分离超平面:x(1)+ x(2) – 3
感知机模型:f(x) =sign(x(1) + x(2) – 3)
附,迭代过程:
迭代次数 |
误分类点 |
w |
b |
w·x + b |
0 |
|
0 |
0 |
0 |
1 |
x1 |
(3, 3) |
1 |
3x(1) + 3x(2) + 1 |
2 |
x3 |
(2, 2) |
0 |
2x(1) + 2x(2) |
3 |
x3 |
(1, 1) |
-1 |
x(1) + x(2) - 1 |
4 |
x3 |
(0, 0) |
-2 |
-2 |
5 |
x1 |
(3, 3) |
-1 |
3x(1) + 3x(2) - 1 |
6 |
x3 |
(2, 2) |
-2 |
2x(1) + 2x(2) - 2 |
7 |
x3 |
(1, 1) |
-3 |
x(1) + x(2) – 3 |
8 |
无(模型确定) |
(1, 1) |
-3 |
x(1) + x(2) – 3 |
注:
上述过程中误分类点先后取:
x1,x3,x3,x3,x1,x3,x3
得到 w = (1, 1), b = -3
若误分类点先后取:
x1,x3,x3。x3,x2,x3,x3,x3,x1,x3,x3
那w = (2, 1), b = -5
可见:
感知机学习算法假设採用不同的初值或迭代不同的误分类点,那结果也不同。
感知机算法的收敛性
到这里有个问题:
怎么知道对一个数据集,我们可採用感知机学习策略?
答案就是:
在经过有限次搜索后。可找到将训练数据全然正确分类的超平面,也就是说算法具有收敛性。
Ps1:算法收敛意味着训练数据集线性可分
Ps2:线性支持向量机可解决上例有多个解的问题
算法的另外一种形式(感知机算法的对偶形式)
在原始形式中有公式:
w= w + ηyixi
b= b + ηyi
那么如果一共改动了n次,则w,b关于(xi(1),xi(2))的增量分别为:
aiyixi和 aiyi (ai= niη)
即:
若η=1,则ai就是第i个点因为误分类而进行更新的次数。即ai = ni。
ai越大 => 实例点更新次数越多 =>越难正确分类,换句话说:这种实例对学习结果影响更大!
然后,感知机算法的对偶形式的算法例如以下:
输入:
线性可分数据集 T={(x1,y1),(x2,y2),...,(xn,yn)},当中x1∈Rn。yi={+1,-1},i=1, 2, ..., n。学习率η(0 < η<= 1)
输出:
感知机模型 f(x) = sign( aiyixi·x + b)
过程:
1, 令a = 0。b = 0
2。 在训练集中取数据(xi,yi)
3, 若
则:
ai= ai + η
b= b + ηyi
4。 转至2直到无误分类数据
而因为对偶形式的训练实例仅以内积形式出现
所以我们预先将训练集中实例间的内积计算出来并以矩阵形式存储,即:产生Gram矩阵(格拉姆矩阵)
G = [ xi, yi ]n*n
样例
输入:
正样本点x1= (3, 3)。x2 = (4,3)
负样本点x3= (1, 1)
求:
感知机模型
解:
1, 令ai= 0。i = 1, 2, 3。b = 0,η=1
2, 计算Gram矩阵
x1·x1 x1·x2 x1·x3
G = x2·x1 x2·x2 x2·x3
x3·x1 x3·x2 x3·x3
3, 误分条件
yi( aiyixi·x + b) <= 0
时。參数更新
ai = ai +1
b = b + yi
4, 開始迭代
由于这里仅仅有3个点
所以:
= yi((a1y1x1·xi + a2y2x2·xi + a3y3x3·xi) + b)
= yi((a1x1·xi + a2x2·xi - a3x3·xi)+ b)
4.1,遍历全部的点。然而在对点x1(第一次迭代)时
由于1*(0 + 0*0 – 0*0) = 0 误分类
所以。
a1 = a1 +1 = 0 + 1 = 1
b = b + y1 = 0 + 1 =1
如今:
a1 = 1, a2= 0, a3 = 0, b = 1
4.2, 遍历全部的点
对点x1
y1*(1 *x1·x1+ 0 – 0 + 1) = 1*(18 + 1) > 0 被正确分类
x2同理,也被正确分类
对点x3
y3*(1 * x1·x3 + 0 – 0 + 1) = -1 * (6 +1) < 0 误分类
所以。
a3 = a3 +1 = 0 + 1 = 1
b = b + y3 = 1 - 1 =0
如今:
a1 = 1, a2= 0, a3 = 1, b = 0
4.3, 遍历全部的点。这一步中x1和x2被正确分类,而x3
y3*(1 *x1·x3+ 0 – 0 * x3·x3 + 0) = -1 * (6 -2) < 0 误分类
所以,
a3 = a3 +1 = 1 + 1 = 2
b = b + y3 = 0 - 1 =-1
如今:
a1 = 1, a2= 0, a3 = 2, b = -1
4.4, 同理,这一步中x1和x2被正确分类。而x3被误分类
所以,
a3 = a3 +1 = 3
b = b + y3 = -2
如今:
a1 = 1, a2= 0, a3 = 3, b = -2
4.5, 这一步中刚遍历到x1时就发现其被误分类
所以,
a1 = a1 +1 = 1 + 1 = 2
b = b + y1 = -2 + 1 =-1
如今:
a1 = 2, a2= 0, a3 = 3, b = -1
4.6,同理,遍历到x3时发现被误分类
更新a3和b之后,如今:
a1 = 2, a2= 0, a3 = 4, b = -2
4.7,同理,遍历到x3时发现被误分类
更新a3和b之后。如今:
a1 = 2, a2= 0, a3 = 5, b = -3
4.8。全被正确分类
5,得出结果:
w = 2x1 + 0x2-5x3 = 2(3,3) – 5(1,1) = (1,1)
b = -3
所以超平面为:
x(1) + x(2)-3 = 0
所以感知机模型为:
f(x) = sign(x(1) + x(2)-3)
随机梯度下降算法中感知机原始模式的代码演示样例
#-*-coding:utf-8-*- # LANG=en_US.UTF-8 # 梯度下降算法 -- 感知机原始模式 # 文件名称:stochastic_gradient_descent.py _list = [ [1, 1, -1], [3, 3, 1], [4, 3, 1], ] w1 = w2 = 0 b = 0 n = 1 _len = len(_list) while [ 1 ]: num = 0 for i in _list: x1 = i[0] x2 = i[1] y = i[2] judge = y * (w1*x1 + w2*x2 + b) if judge <= 0: w1 = w1 + y*x1 w2 = w2 + y*x2 b = b + y else: num += 1 if num == _len: print("f(x) = sign( (%s,%s)*x + %s )" % (w1, w2, b) ) break