感知机模型原理和对偶形式与二分类问题及python实现

上一篇:神经网络分类与预测的基本原理

什么是感知机?

感知机是一种二分类线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。所谓二分类是因为其只有两种输出“+1”和“-1”,所谓线性,是因为感知机只能解决线性可分的问题。
感知机训练的目标是得到一个能够将训练数据集两类实例点完全正确分开的分类超平面(超平面就是比样本特征维数少一,对于三维样本,其超平面是一个二维的面,二维样本的超平面是一条线);如果是线性不可分可分的数据,则算法无法收敛。
假设有以下10个小虫数据,每个小虫有两个特征长和宽,可将其分为两类
在这里插入图片描述
将其在图上画出,如图:
在这里插入图片描述
显然,这两类小虫可以被一条直线分开,是线性可分的,我们的目标就是想通过上述10条样本数据找到一个相对合理的“分类超平面”。
我们知道,直线的一般形式是Ax+By+C = 0这里A,B,C是待确定参数,x,y可以写作x1,x2,表示两个输入特征,如果我们将A,B记为w1,w2,C写作b,那么上述直线可表示为w1x1+w2x2+b=0,现令 W=[w1,w2] 称为权值向量X=[x1,x2] 称为输入特征向量b 是一个实数,可以叫做偏置项,运用线性代数的知识可以看出,上述直线可以表述为: X*W.T+b=0 (就是其中一个的行向量,乘以另一个的列向量)
更一般的形式是输入特正X为列向量,权值W为行向量,那么可以写为W*X+b=0
我们可以画出感知机模型的一般形式:
在这里插入图片描述
也就是说,输入特征和权值的线性组合加上偏置项后会得到一个数,如果这个数大于0,则输出1,如果这个数小于0,则输出-1,对于0,一般将其划为负例,可以将上述用一个符号函数表示出来:
在这里插入图片描述
f(x)的值,实际上就是感知机模型的预测值

什么是误分类样本

误分类样本,就是预测值(f(x)的值)与样本实际值(标签值)不符。先来看一个例子:
对于直线y=2x+1,将其写为一般形式为y-2x-1=0
在这里插入图片描述
点(2,2)在直线下方,点(1,5)在直线上方。
将(2,2)带入直线方程,2 - 2*2 - 1= -3 < 0
将(1,5)待入直线房程,5 - 2*1 - 1 = 2 > 0
也就是说,对于感知机模型来说,如果其输出为负,表示将这个样本点分到了超平面的下方,输出为正,则将该样本点分到了超平面的上方。
对于样本正确的分类,我们是已知的,也就是样本标签,不难发现,对于错分样本,其满足y * f(x)<0(样本标签*实际输出<0)
满足这个条件的分类样本,成为误分类样本。
我们训练的目标,就是让误分类样本尽量接近分类超平面
应用高中学过的点到直线距离公式:
在这里插入图片描述
将其写为向量形式:
在这里插入图片描述
进一步说明我们的训练目标,现在可以将其表达为:让所有的误分类样本距离分类超平面的距离最小,也就是下面这个式子:
在这里插入图片描述
(说一下为什么要乘上-y,因为我们希望通过求导数的方法来极小化L,而我们知道,绝对值函数在0处是不可导的,所以只能想办法去掉绝对值,我们知道对于误分类样本总有y * f(x)<0,也就是-y * f(x)>0,从而能保证这个值总是大于零的,又因为y只取+1或-1,所以不会影响其大小,也就是起到了去绝对值的作用)

也就是希望L(w,b)越小越好
我们继续使用引例中的思想,对其求导数,只不过这里有多个变量了对其求偏导数:
在这里插入图片描述
过程很简单,就不展开了。现在我们得到了W和b训练时的更新量大小了,因为我们想极小化L(W,b),所以应使其向负梯度方向进行,也就是导数的反方向
到这里,我们就能得到感知机算法的原始形式了:
1)随机初始化权值w和b
2)一直选取样本点
3)对于误分类点,用其来更新权重:
W+=y*x (也就是沿梯度方向进行)
b+=y
4)如果没有误分类点则算法结束,否则转到2)
在权重更新的时候需要加一个步长,表示更新的多少,为一个0,1之间的小数,也叫做学习率
用python表示上述算法可得:

import numpy as np
import matplotlib.pyplot as plt
#样本及对应标签
x=np.array([[1,2],[1,3],[2,2.5],[3,5],[4,6],[6,5],[7,4],[8,6],[9,7],[7.5,5.5]])
y=np.array([1,1,1,1,1,-1,-1,-1,-1,-1])
#画出样本点
for i in range(len(x)):
        if y[i]>0:
            c = "red"
        else:
            c = "green"
        plt.scatter(x[i][0],x[i][1],color = c)

#初始化权值w为0
w = np.array(np.zeros(2))
#设置学习率(步长)为0.5
Lr=0.5
#进行训练
while True:
	#看看是否还有误分类点
    Flag = True
    for i in range(len(x)):
        t = np.dot(x[i].T,w)*y[i]
        #误分类点,用其来更新权重
        if t<=0:
            w+=Lr*x[i]*y[i]#之所以用+ 是要向负梯度方向进行
            Flag = False
    #没有误分类点了,退出算法
    if Flag:
        break
#可视化得到的分类超平面
plt.plot([0,10],[0,-(w[1]/w[0])*10])
print(w)
plt.show()

这就是感知机算法的原始形式
下面介绍感知机算法的对偶形式
对于感知机的一般形式来讲,每一次判断该样本是否被错分都需要计算内积,对于特征维数很高的样本,计算量就变得很大了,而这种方式仅仅是为了判断该样本是否被错分,而真正更新权值的时候,是不需要计算内积,所以这些大量的计算,多少会有些无用功的意思。
所以,我们希望换一种计算量更为简单的错分样本判断方式,推导过程如下:
假设第i个样本被错分了ai次,那么最终的权值和偏置就可以表示为:
在这里插入图片描述
其中,W0,b0为初始值,N为样本个数,ai为第i个样本的使用次数(曾被错分的次数),Lr为步长(学习率)
将上述W和b带入f(x)得到下式:
在这里插入图片描述
可以看到,原本存在的权重W和x的内积消失了,现在有的仅仅是xi和xj的内积,而x是确定不变的,所以可以实现求出来,将x之间的的内积表示为矩阵形式,成为Gram矩阵

相应的训练过程变为
1)ai初始为0
2)选取第i个样本
3)判断是否错分,如果
在这里插入图片描述
表示xi这个样本被错分,则进行参数更新ai为ai+1
4)如果没有被错分的样本了,则结束算法,否则转到2)继续进行

示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
#样本及对应标签
x=np.array([[1,2],[1,3],[2,2.5],[3,5],[4,6],[6,5],[7,4],[8,6],[9,7],[7.5,5.5]])
y=np.array([1,1,1,1,1,-1,-1,-1,-1,-1])
#画点
for i in range(len(x)):
        if y[i]>0:
            c = "red"
        else:
            c = "green"
        plt.scatter(x[i][0],x[i][1],color = c)
#计算xi和xj的内积,记为Gram矩阵
Gram = np.empty((len(x),len(x)),np.int)
for i in range(len(x)):
    for j in range(len(x)):
        Gram[i][j] = np.dot(x[i],x[j].T)
Lr = 0.5
#各各样本的使用次数ai全都初始化为0
a = np.zeros(len(x))
#感知机算法的对偶形式
while True:
    Flag = True
    for i in range(len(x)):
        sum = 0
        for j in range(len(x)):
            sum+=a[j]*y[j]*Gram[j][i]*Lr+a[j]*y[j]*Lr
        if y[i]*sum<=0:
            Flag = False
            a[i]+=1
    if Flag:
        break
print(a)
#得到各各样本的使用次数后就可以用来计算权值
b = 0
w = np.array(np.zeros(2))
for i in range(len(x)):
    w+=Lr*x[i]*y[i]*a[i]
    b+=a[i]*y[i]*Lr
#画图
plt.plot([0,10],[b,-(w[1]/w[0])*10+b])
print(w,b)
plt.show()

在这里插入图片描述
可以看到对偶形式也能较好地解决二分类问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值