感知机是由美国学者Fran Rosenblatt 在1957 年提出来的一种算法,也是作为神经网络(深度学习)的起源的算法。
分类(classification)指的是预测样本所属类别的一类问题。形式化表述,分类问题的目标就是给定输人样本x,将其分配给K种类别中的一种,其中k=1,…,K。如果K=2,则称为二分类,否则称为多分类。
线性分类模型与感知机算法
线性分类模型就是通过一条“线”将数据一分为二。线性模型由特征函数和对应的权重向量组成。
而通过线性分类模型进行分类的话,必须先将样本转化为向量然后有一个感知机分类器才能进行。
特征向量与样本空间
特征向量:描述样本特征的向量。
样本空间:样本分布的空间。
在收集了大量的样本后,可能会得到一个密集的样本空间。

在样本转化为了特征向量后,分类问题实质上就是对样本空间的切割问题。
决策边界与分离超平面

如上图所示,若两个样本可以通过一条直线分开。那么左右两边称为决策区域,而这条直线成为了决策边界。
二维空间中,如果决策边界是直线,则称产生该决策边界的模型为线性分类模型。
三维空间中的线性模型用平面做决策,任意维度空间中的线性决策边界统称为分离超平面。

将其推广到N维空间:w1x+w2y+w3z+.....+b=0w=[w1,....,wN,b],x=[x,y,z,....,1]如上图:直线方程为3x−y−1.5=0,那么权重向量为【3,−1,−1.5】,那么“沈雁冰”的特征向量为【1,1,1】在有了决策边界的方程之后,线性模型使用方程左边的符号来作为最终的决策。例如:沈冰雁【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个实例预测错误,模型训练前功尽弃。怎么办呢?
可以采用简单的解决方法:投票感知机和平均感知机
投票感知机:在每次迭代的时候,将参数、准确率都保留。在最后预测的时候每个模型都给出自己的结果,然后乘上对应的准确率加权平均值就得出最终结果。最后结果最高的确立为最终的参数。
平均感知机:对每次迭代取模型参数加权相加平均,将平均值作为最终结果。

## 实例
通过使用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
感知机模型由于其简单,在应用时也有一定的局限,主要体现在以下几点。
* 感知机只能处理线性可分的数据集,线性不可分的数据集会引起分离超平面的震荡而无法收敛。
* 感知机的判别模型由符号函数给出,无法表示更复杂的非线性映射。