声明:
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