首页 > 代码库 > 感知机2 -- 随机梯度下降算法

感知机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


感知机2 -- 随机梯度下降算法