算法:感知机及python实现

1.简介

感知机(perceptron),一种构建超平面进行二分类的模型,也是神经网络和支持向量机的基础。构建误分类点到超平面的距离和的损失函数,通过随机梯度下降法进行优化,即可以得到感知机模型。

2.模型

感知机模型为一超平面:
f ( x ) = s i g n ( w x + b ) f(x) = sign(wx + b)
其中, x R n , w R n , b R x\in R^n, w \in R^n, b \in R .
也就是, w x + b > 0 wx+b>0 ,模型认为该样本为正类(+1); w x + b < 0 wx+b<0 ,模型认为该样本为负类(-1).

示意图,事实 x x 的维度可以是多维。
在这里插入图片描述

3.学习策略(损失函数)

一种学习策略是,最小误分的样本点数量和,但该目标对模型参数并非连续可导。
M M 代表样本点被误分的集合。
损失函数为这些误分样本点到超平面的距离和,当距离和为0时,代表没有点被误分。
由于,点到面的距离为: 1 w w x i + b \frac{1}{|| w ||} |wx_i+b| .
由于误分类点都满足, y i ( w i + b ) < 0 y_i(w_i + b) < 0 ,于是损失函数为:
L ( w , b ) = 1 w x i M y i ( w x i + b ) L(w,b) = - \frac{1}{|| w ||} \sum\limits_{x_i \in M} y_i(wx_i +b)

优化目标则是损失函数最小化。

4.学习算法(优化算法)

随机优化算法(stochastic gradient descent),也就是每次都选取一个被误分的点,计算损失函数,并进行参数更新。
计算梯度:
w L ( w , b ) = x i M y i x i b L ( w , b ) = x i M y i \begin{aligned} &\nabla_{w} L(w, b)=-\sum_{x_{i} \in M} y_{i} x_{i}\\ &\nabla_{b} L(w, b)=-\sum_{x_{i} \in M} y_{i} \end{aligned}
参数更新:
w w + η y i x i b b + η y i \begin{aligned} &w \leftarrow w+\eta y_{i} x_{i}\\ &b \leftarrow b+\eta y_{i} \end{aligned}
总的算法:
在这里插入图片描述
算法收敛性:
在线性可分条件下,上述感知机学习算法是收敛的。
在这里插入图片描述

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个二元分类器.


参考:

  1. sklearn.linear_model.Perceptron;
  2. 李航 统计学习方法
  3. wiki 多元分类
发布了510 篇原创文章 · 获赞 152 · 访问量 77万+

猜你喜欢

转载自blog.csdn.net/rosefun96/article/details/104881348