感知机算法

感知机是由美国学者Fran Rosenblatt 在1957 年提出来的一种算法,也是作为神经网络(深度学习)的起源的算法。

分类(classification)指的是预测样本所属类别的一类问题。形式化表述,分类问题的目标就是给定输人样本x,将其分配给K种类别中的一种,其中k=1,…,K。如果K=2,则称为二分类,否则称为多分类。

线性分类模型与感知机算法

线性分类模型就是通过一条“线”将数据一分为二。线性模型由特征函数和对应的权重向量组成。

而通过线性分类模型进行分类的话,必须先将样本转化为向量然后有一个感知机分类器才能进行。

特征向量与样本空间

特征向量:描述样本特征的向量。

样本空间:样本分布的空间。

在收集了大量的样本后,可能会得到一个密集的样本空间。

在样本转化为了特征向量后,分类问题实质上就是对样本空间的切割问题。

决策边界与分离超平面

如上图所示,若两个样本可以通过一条直线分开。那么左右两边称为决策区域,而这条直线成为了决策边界。

二维空间中,如果决策边界是直线,则称产生该决策边界的模型为线性分类模型。

三维空间中的线性模型用平面做决策,任意维度空间中的线性决策边界统称为分离超平面

img

将其推广到N维空间:w1x+w2y+w3z+.....+b=0w=[w1,....,wN,b],x=[x,y,z,....,1]如上图:直线方程为3xy1.5=0,那么权重向量为【3,1,1.5,那么“沈雁冰”的特征向量为【111】在有了决策边界的方程之后,线性模型使用方程左边的符号来作为最终的决策。![](https://voluntexi.github.io//postimages/1658720021793.png)例如:沈冰雁【111】带入直线方程311.5=0.5>0,决策符号为1。线性可分:如果数据集中所有样本都可以被分离超平面分割。若出现线性不可分的数据,我们可以采用如下方式来进行分类:定义更多的特征给定了训练集,可以通过感知机来进行训练线性模型。读入训练样本,进行预测singn(wX)\\将其推广到N维空间:w_1x+w_2y+w_3z+.....+b=0 w=[w_1,....,w_N,b],x=[x,y,z,....,1] 如上图:直线方程为3x-y-1.5=0,那么权重向量为【3,-1,-1.5】,那么“沈雁冰”的特征向量为【1,1,1】 在有了决策边界的方程之后,线性模型使用方程左边的符号来作为最终的决策。 ![](https://voluntexi.github.io//post-images/1658720021793.png) 例如: 沈冰雁【1,1,1】带入直线方程3-1-1.5=0.5>0,决策符号为1。 线性可分:如果数据集中所有样本都可以被分离超平面分割。 若出现线性不可分的数据,我们可以采用如下方式来进行分类: * 定义更多的特征 给定了训练集,可以通过感知机来进行训练线性模型。 * 读入训练样本,进行预测**singn(w • X)**

在x=-0.3,y=0.96的时候 不符合,此时更新w和b,
\w_1=w_1+zxŋ=1-0.30.5=0.85,\w_2=w_2+zyŋ=1+0.960.5=1.48\
b=b+1*ŋ=-0.5

import numpy as np # 初始化 w 和 b # 向量的点积 return np.dot(w,x)+b X = np.array([[5,2], [3,2], [2,7], [1,4], [6,1], [4,5]]) run = True run = False if y*d(x)<=0: run = True print(w,b) negative = [x for x,y in zip(X,Y) if y==-1] plt.title('w='+str(w)+', b='+str(b)) plt.scatter([x[0] for x in negative],[x[1] for x in negative],c='red',marker='x') plt.xlim(min([x[0] for x in X])-1,max([x[0] for x in X])+1) plt.show()

eg:假设损失函数J(w)=w^2,w=1时, △w=2w=2,方向为正无穷\
如果参数反方向移动,取学习率a=0.5,\
则w\leftarrow 1-0.5*2=0,则J(0)=0,马上就减少了

J(w)=\frac{1}{N}\sum^{N}_{i=1}max(0,-ywx)
\其中,y为误分类点,w为参数,x为训练样本自变量

### 投票感知机和平均感知机 假设有10 000个实例,模型在前9999个实例的学习中都完美地得到正确答案,说明此时的模型接近完美了。可是最后一个实例是个噪声点,朴素感知机模型预测错误后直接修改了模型,导致前面9999个实例预测错误,模型训练前功尽弃。怎么办呢? 可以采用简单的解决方法:投票感知机和平均感知机 投票感知机:在每次迭代的时候,将参数、准确率都保留。在最后预测的时候每个模型都给出自己的结果,然后乘上对应的准确率加权平均值就得出最终结果。最后结果最高的确立为最终的参数。 平均感知机:对每次迭代取模型参数加权相加平均,将平均值作为最终结果。 ![](https://voluntexi.github.io//post-images/1658720047833.png) ## 实例 通过使用hanlp来对"赵建军", "沈雁冰", "陆雪琪", "李冰冰"进行性别的分类 ```python from tests.test_utility import ensure_data TRAINING_SET = os.path.join('./train.csv') def run_classifier(): print('训练集准确率:', classifier.train(TRAINING_SET, 10, False)) print('特征数量:', len(model.parameter)) for name in test: print('测试集准确率:', classifier.evaluate(TESTING_SET)) run_classifier() 训练集准确率: P=85.72 R=85.05 F1=85.39 赵建军=男 陆雪琪=女 测试集准确率: P=83.35 R=82.82 F1=83.09 感知机模型由于其简单,在应用时也有一定的局限,主要体现在以下几点。 * 感知机只能处理线性可分的数据集,线性不可分的数据集会引起分离超平面的震荡而无法收敛。 * 感知机的判别模型由符号函数给出,无法表示更复杂的非线性映射。