《统计学习方法》——感知机
感知机模型
定义2.1(感知机): 假设输入空间是
,输出空间是
。输入
表示实例的特征向量,对应于输入空间的点;输出
表示实例的类别。由输入空间到输出空间的如下函数
,称为感知机。其中,w和b为感知机模型参数,
叫做权值或权值向量,
叫做偏置,
表示w和x的内积。sign是符号函数,即
感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型或线性分类器,即函数集合

感知机学习策略
定义2.2(数据集的线性可分性): 给定一个数据集
其中,
,
,
,如果存在某个超平面S:
,能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有
的实例i,有
,对所有
的实例i,有
,则称数据集T为线性可分数据集;否则,称数据集T线性不可分。
对于上述训练集T,感知机
学习的损失函数(所有误分类点到超平面S的总距离)定义为:

其中M为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。
感知机学习算法
感知机学习算法是误分类驱动的,具体采用随机梯度下降法。首先,任意选取一个超平面
,然后用梯度下降法不断地极小化目标函数。极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
假设误分类点集合M是固定的,那么损失函数L(w,b)的梯度由下式给出:


随机选取一个误分类点
,对w,b进行更新:


练习
1.思考感知机模型假设空间是什么?模型复杂度体现在哪里?
感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型或线性分类器,即函数集合
。
模型复杂度体现在
的特征数量,也就是维度d上。
2.已知训练数据集D,其正实例点是
,
,负实例点是
,
(1)用python自编程实现感知机模型,对训练数据集进行分类,并对比误分类点选择次序不同对最终结果的影响。可采用函数式编程或面向对象的编程。
随机梯度下降法:
输入:训练数据集
,其中
,
,
;学习率
输出:w,b;感知机模型
(1)选取初值
(2)在训练集中选取数据
(3)如果


(4)转至(2),直至训练集中没有误分类点
直观解释: 当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整w,b的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。
代码如下:
# coding:utf-8
"""
@author:hanmy
@file:perceptron.py
@time:2019/04/25
"""
import numpy as np
class Perceptron:
def __init__(self, x, y, n, eta):
self.x = x # 实例点
self.y = y # 实例点的分类
self.n = n # 实例点个数
self.eta = eta # 学习率
# 随机梯度下降法
def SGD(self):
# 对w,b取初值
w = np.array([0, 0])
b = 0
# 记录一次迭代是否有误分类点
flag = 1
while flag == 1:
flag = 0
for i in range(n):
# 如果有误分类点
if self.y[i] * (w.dot(self.x[i]) + b) <= 0:
# 更新w,b,设置flag为1
w = w + self.eta * self.y[i] * self.x[i]
b = b + self.eta * self.y[i]
flag = 1
return w, b
if __name__ == "__main__":
x = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
n = 3
eta = 1
perceptron = Perceptron(x, y, n, eta)
w, b = perceptron.SGD()
print("模型参数w:", w, "b:", b)
学习到的模型参数为
(2)试调用sklearn.linear_model的Perception模块,对训练数据集进行分类,并对比不同学习率
对模型学习速度及结果的影响。
Perceptron(penalty=None, alpha=0.0001, fit_intercept=True, n_iter=5, shuffle=True, verbose=0, eta0=1.0, n_jobs=1, random_state=0, class_weight=None, warm_start=False)
参数
1.penalty:正则化项 ,默认值为None,可选值为'l2' or 'l1' or 'elasticnet'
l1让特征值更稀疏,l2让权值更均匀。
2.alpha:正则化系数 ,默认值为0.0001
正则化系数过小则无约束效力,过大则约束的太狠。
3.eta0:学习率 ,默认值为1,可选值为(0,1]
在w和b初始值为0时,学习率对迭代过程和最终结果无影响。
4.n_iter:迭代次数 ,默认值为5
方法
1.fit: 用于训练数据集
2.score: 用来评价训练效果
from sklearn.linear_model import Perceptron
import numpy as np
X = np.array([[3, 3], [4, 3], [1, 1]])
Y = np.array([1, 1, -1])
perceptron = Perceptron()
# fit用于训练数据集
perceptron.fit(X, Y)
# coef_:权重w,intercept_:b,n_iter:迭代次数
print("w:", perceptron.coef_, "\n", "b:", perceptron.intercept_, "\n", "n_iter:", perceptron.n_iter)
# score用来评价训练效果
res = perceptron.score(X, Y)
print("correct rate:{}".format(res))
结果如下:
w: [[1. 0.]]
b: [-2.]
n_iter: 5
correct rate:1.0
