1、定义
感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1、-1二值。感知机对应输入空间中将实例划分为正负两类的分离超平面,属于判别模型。
2、模型
2.1函数表达
由输入空间到输出空间的如下函数:
称为感知机。w是权值,sign()是符号函数,其中的变量是w和x的内积。
2.2几何意义
w是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点分别称为正负两类。
3、损失函数
由数学知识可得输入空间Rn其中一点到超平面的距离
这里||w||是w的L2范数
L2范数的计算公式如下:
对于错误分类的数据,y与w·x+b的正负相反,有y(w·x+b)<0,所以错误分类点到超平面的距离为
所有误分类点的距离综合相加且不考虑w就是该模型的损失函数。
即感知机sign(w`x+b)的损失函数定义为
接下来就是最小化损失函数。
4、感知及学习算法原始形式
用随机梯度下降法迭代,来求min L(w,b):
※※输入:T={(x1,y1),(x2,y2),…,(xn,yn)} 其中xi∈Rn,yi∈{-1,+1}
※※输出:w,b
对L(w,b)的w、b分别求导,随机选取一个误分类点,可以对w、b进行更新。
其中a是步长。意思就是每次下降多少梯度。
这种算法的直观解释:当一个实例点被误分类的时候,调整参数的值,使分离超平面向该误分类点一侧移动来减少误分类点与超平面的距离,直到超平面越过该分类点使之正确分类。
5、对偶形式
对偶形式基本想法是:将w和b表示为实例x和实例有的线性组合,通过求解系数而求解w和b。
因为由原始算法我们可以知道,假设一共修改了n次,那么w,b关于(xi,yi)的增量分别是aiyixi和aiyi。其中ai=ni a(步长)
※※解释:对于(xi,yi)这个点,可能要下降ni次才能使它正确分类。每次下降步长是上面普通算法中的a。那么,我们就可以用aiyixi的和来表示w。即所有点走的步长
初始化a=0,b=0
也就是说,对偶形式中训练实例只以内积的形式出现。
6、收敛性问题
定理表明,误分类的次数k是由上界的,就是说经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。即当训练数据线性可分的时候,感知及学习算法原始、对偶形式迭代都是收敛的。
7、代码:
class Model:
#初始化w,b和学习率
def __init__(self):
self.w = np.ones(len(data[0]) - 1, dtype=np.float32)
self.b = 0
self.l_rate = 0.1
# self.data = data
#定义sign函数
def sign(self, x, w, b):
y = np.dot(x, w) + b
return y
# 随机梯度下降法,只要还有分类错误的点,就遍历所有的点,对错误分类的点进行梯度下降
def fit(self, X_train, y_train):
is_wrong = False
while not is_wrong:
wrong_count = 0
for d in range(len(X_train)):
X = X_train[d]
y = y_train[d]
if y * self.sign(X, self.w, self.b) <= 0:
self.w = self.w + self.l_rate * np.dot(y, X)
self.b = self.b + self.l_rate * y
wrong_count += 1
if wrong_count == 0:
is_wrong = True
return 'Perceptron Model!'
def score(self):
pass
sklearn实例:
import sklearn
from sklearn.linear_model import Perceptron
clf = Perceptron(fit_intercept=True,
max_iter=1000,
shuffle=True)
clf.fit(X, y)
#输出权值w
print(clf.coef_)
#输出系数b
print(clf.intercept_)