统计学习方法 第二章 感知机

来源:互联网 发布:手机暖宝宝软件 编辑:程序博客网 时间:2024/06/05 09:13

感知机是二分类的线性分类模型,输入是实例的特征xRn,输出是实例的类别{1,+1}。感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

1 模型

假设输入空间(特征空间)是XRn,输出空间是Y={+1,1}.由输入空间到输出空间的如下函数

f(x)=sign(wx+b)
称为感知机。

2 策略

假设训练数据集是线性可分的。给定训练数据集

T={(x1,y1),(x2,y2),,(xN,yN)}
其中,xiX=RnyiY={+1,1},i=1,2,,N
感知机sign(wx+b)学习的损失函数为
L(w,b)=xiMyi(wxi+b)
其中M为误分类点的集合。

3 算法

3.1 原始形式

梯度下降法

wbw+ηyixib+ηyi

3.2 对偶形式

假设初始值w0,b0均为 0。对误分类点(xi,yi)通过ni次修改(i=1,2,,N)

wbw+niηyixib+niηyi

对应误分类点xi
nibni+1b+ηyi

4 代码

4.1 原始形式

输入:训练数据集T={(x1,y1),(x2,y2),,(xN,yN)},其中xiX=RnyiY={1,+1},i=1,2,,N;学习率η(0<η1)
输出:w,b;感知机模型f(x)=sign(wx+b).
(1) 选取初始值w0,b0
(2) 在训练集中选取数据(xi,yi)
(3) 如果yi(wxi+b)0

wbw+ηyixib+ηyi

(4) 转至(2),直到训练集中没有误分类点。

4.2 对偶形式

输入:训练数据集T={(x1,y1),(x2,y2),,(xN,yN)},其中xiX=RnyiY={1,+1},i=1,2,,N;学习率η(0<η1)
输出:n,b;感知机模型f(x)=sign(Nj=1njηyjxjx+b).
其中n=(n1,n2,,nN)T.
(1)n0,b0
(2)在训练集中选取(xi,yi)
(3)如果yi(Nj=1njyjxjxi+b)0

nibni+1b+ηyi

(4)转至(2)直到没有误分类数据.


import numpy as np"""原始类型的感知器输入:训练数据x,y和eta输出:w,b感知机模型:f(x) = sign(wx+b)"""def perceptron_original (x, y, eta):    (m, n) = x.shape    w = np.zeros(n)    b = 0    ok = True    while True:        for i in range(m):            if y[i]*(np.dot(w,x[i])+b) <= 0:                w = w + eta*y[i]*x[i]                b = b + eta*y[i]                ok = False        if not ok:            ok = True        else:            break    return w, b# mainarr = np.loadtxt('test.txt', delimiter=',')[m,n]=arr.shape # m是训练数据的条数,n是训练特征数n = n - 1x = arr[:,0:n] # 输入y = arr[:,n] # 输出eta = 1(w, b) = perceptron_original(x, y, eta)print wprint b
import numpy as np"""对偶形式的感知机输入:训练数据x、y,学习率eta输出:a、b"""def perceptron_dual (x, y, eta):    (m, n) = x.shape    a = np.zeros(m)    b = 0    ok = True    while True:        for i in range(m):            w = np.zeros(n)            for j in range(m):                w += a[j]*y[j]*x[j]            if y[i]*(np.dot(w, x[i]) + b) <= 0:                a[i] += 1                b += eta*y[i]                ok = False        if not ok:            ok = True        else:            break    return a, b# mainarr = np.loadtxt('test.txt', delimiter=',')[m,n]=arr.shape # m是训练数据的条数,n是训练特征数n = n - 1x = arr[:,0:n] # 输入y = arr[:,n] # 输出eta = 1(w, b) = perceptron_dual(x, y, eta)
0 0
原创粉丝点击