1.简介
感知机(perceptron),一种构建超平面进行二分类的模型,也是神经网络和支持向量机的基础。构建误分类点到超平面的距离和的损失函数,通过随机梯度下降法进行优化,即可以得到感知机模型。
2.模型
感知机模型为一超平面:
其中,
.
也就是,
,模型认为该样本为正类(+1);
,模型认为该样本为负类(-1).
示意图,事实
的维度可以是多维。
3.学习策略(损失函数)
一种学习策略是,最小误分的样本点数量和,但该目标对模型参数并非连续可导。
令
代表样本点被误分的集合。
损失函数为这些误分样本点到超平面的距离和,当距离和为0时,代表没有点被误分。
由于,点到面的距离为:
.
由于误分类点都满足,
,于是损失函数为:
优化目标则是损失函数最小化。
4.学习算法(优化算法)
随机优化算法(stochastic gradient descent),也就是每次都选取一个被误分的点,计算损失函数,并进行参数更新。
计算梯度:
参数更新:
总的算法:
算法收敛性:
在线性可分条件下,上述感知机学习算法是收敛的。
5. 实践
from sklearn import datasets
import numpy as np
## Example 1
# breast cancer for classification(2 classes) X(569, 30) y(569,)
X, y = datasets.load_breast_cancer(return_X_y=True)
y = np.where(y==0, -1, 1)
# my perceptron
class Perceptron():
def __init__(self):
self.W = np.ones((len(X[0]),),dtype=float)
self.b = 0
self.lr = 0.01
self.epoch = 100
def fit(self, X, y):
for ep in range(self.epoch):
for i in range(len(X)):
if y[i]*(np.dot(X[i],self.W)+self.b) <= 0:
self.W += self.lr*y[i]*X[i]
self.b += self.lr*y[i]
def predict(self, X):
return np.where(np.dot(X,self.W)+self.b>0,1,-1)
def score(self,X,y):
y_pred = self.predict(X)
return 1 - np.count_nonzero(y-y_pred)/len(y)
perceptron = Perceptron()
perceptron.fit(X,y)
y_pred = perceptron.predict(X)
print(perceptron.score(X,y))
运行结果:
Accuracy为:0.8963
.
同样使用sklearn的API:
# sklearn API
from sklearn.linear_model import Perceptron
clf = Perceptron(tol=1e-3, random_state=0)
clf.fit(X, y)
y_pred = clf.predict(X)
print(clf.score(X,y))
Accuracy只有:0.6871
.
6.多分类感知机
sklean API的感知机是支持多分类的。
主要可以通过 一对多(one Vs Rest) 和 一对一(one Vs one) 两种方式进行拓展。
一对多方法:
每次把某个样本定为正样本,其余样本作为负样本。对于K(k>=3),我们可以用K个分类器.
一对一方法:每次选一个类作为正类样本,负类样本则变成只选一个类。对于K分类问题需要训练(k-1)*k/2个二元分类器.
参考: