1. 引言
感知机是1957年由Rosenblatt提出的一个线性分类模型,对应与输入空间(特征空间)中将实例分为正负两类的分离超平面,属于判别模型中的一种,也是神经网络和支持向量机的基础。原始论文的地址如下:
下面将具体介绍一下感知机模型的原理,并利用python来实现它。
2. 感知机原理介绍
2.1 模型的定义
假设输入空间(特征空间)为,输出空间为
,
分别对应一个实例的特征向量和标签,则感知机的计算公式如下:
其中,分别为感知机模型的权重和偏置,
为符号函数,其表达式如下:
感知机有如下的几何解释:线性方程
对应于特征空间中的一个超平面
,其中,
分别对应超平面的法向量和截距,这个超平面刚好将特征空间分为正负类两部分,如图1所示,因此,感知机其实就是一个分离超平面。
![](https://i-blog.csdnimg.cn/blog_migrate/fb2118ecb4e7a19209db1504326589a4.png)
2.2 模型的损失函数
感知机的损失函数采用的是误分类点到超平面的总距离,我们知道,对于输入空间
中任一点
到超平面
的距离为:
其中,为
的
范数。对于误分类的数据
来说,有:
因此,误分类点到超平面
的距离为:
不考虑,就可以得到感知机模型的损失函数。
给定训练数据集,其中,
,
,
,则感知机的损失函数为:
其中,为误分类点的集合。因此,当存在误分类点时,损失函数是非负的,当不存在误分类点时,则损失函数为0。
2.感知机的python实现
python中sklearn已经集成了感知机模型,因此,本文直接调用python中的sklearn来实现感知机模型,数据集选用的是经典的iris鸢尾花数据集,由于iris鸢尾花数据集有三种类别,因此,只选取其中两类作为训练集。代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
def load_data():
"""
加载iris模型,只选择其中两类作为训练集
:return:
"""
iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df = iris_df[(iris_df['label'] != 2)]
iris_df['label'][(iris_df['label'] == 0)] = -1
return iris_df
def plot_perceptron(data, model):
"""
绘制感知机模型
:param data: 训练数据. [dataframe]
:param model: 训练好的模型. [model]
:return:
"""
plt.plot(data.iloc[:, 0][(data['label'] == -1)], data.iloc[:, 1][(data['label'] == -1)], 'bo', color='blue',
label='0')
plt.plot(data.iloc[:, 0][(data['label'] == 1)], data.iloc[:, 1][(data['label'] == 1)], 'bo', color='orange',
label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
x_ponits = np.arange(4, 8)
y_ = -(model.coef_[0][0] * x_ponits + model.intercept_) / model.coef_[0][1]
plt.plot(x_ponits, y_)
plt.show()
def main():
iris_df = load_data()
clf = Perceptron(fit_intercept=False, max_iter=1000, shuffle=False)
clf.fit(iris_df.iloc[:, [0, 1]], iris_df.iloc[:, -1])
plot_perceptron(iris_df, clf)
if __name__ == '__main__':
main()
最终获得的感知机模型对iris数据集的划分如图2所示,发现最终感知机只对一个样本出现了误判。
![](https://i-blog.csdnimg.cn/blog_migrate/c479b4e0381f820ffb29033ff48d295b.png)
3.模型总结
通过前文的介绍可以发现,感知机模型虽然结构简单,收敛速度快,但是其应用场景只适合于线性可分的场景,并且每次计算由于对超平面不做条件限制,因此,得到的模型参数可能会不一致,毕竟可以将一个线性可分数据集进行分割的平面可能存在无穷多个。