感知机是根据输入实例的特征向量x对其进行二类分类的线性分类模型,属于判别模型。
感知机模型的假设空间是定义在特征空间中的所有线性分类模型或线性分类器,
即函数集合。
感知机模型的一般形式:
其中,x表示特征向量,和b是感知机模型参数,叫做权值或权值向量,b叫做偏置(bias),表示和x的内积,sign是符号函数,即
感知机模型对应于特征空间中的分离超平面:
感知机对应于特征空间中将实例划分为正负两类的一个分离超平面S,其中是超平面的法向量,b是超平面的截距。而这个超平面将特征空间划分为两个部分,位于两部分的点(特征向量)分别被称为正负两类,输入为实例的特征向量,输出为实例的类别,取+1和-1。所以这个超平面S称为分离超平面。
感知机使用一个超平面把实例分为正负类,但一些数据集并不是线性可分的,所以任何超平面都不能正确地将所有实例进行分类。
总的来说,通过训练感知机模型将实例点进行分类,如红豆绿豆混合后进行分类,届时需要一个超平面将两类划分并进行标记为+1和-1。
import numpy as np
def perceptron(x1, x2):
x = np.array([x1, x2]) # 特征向量
w = np.array([0.3, 0.7]) # 权值
b = -0.3 # 偏置
f = np.sum(w * x) + b # 感知机模型一般形式
# f = np.dot(w, x) + b
# 通过模型训练对实例进行划分
if f >= 0:
return 1 # 正类
else:
return -1 # 负类
# 输入特征向量 x
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = perceptron(x[0], x[1])
print(str(x) + '-->' + str(y))
(0, 0)-->-1
(1, 0)-->1
(0, 1)-->1
(1, 1)-->1
如果存在某个超平面S能将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有的实例 i,有,对所有的实例,有,则称数据集为线性可分数据集;否则,称数据集线性不可分。在现实中,这种数据集是理想的,存在可能小。
为了找到这样的超平面,即确定感知机模型参数,b,需要确定一个学习策略,这个学习策略即是定义损失函数并将损失函数极小化。感知机一般采用的有:损失函数的一个自然选择是误分类点的总数,损失函数的另一个选择是误分类点到超平面S的总距离。而前者损失函数不是参数,b的连续可导函数,不易优化。这样,假设超平面S的误分类点集合为M,那么就可得到所有误分类点到超平面S的总距离,从而得出感知机学习的损失函数。此时给定训练数据集的情况下,损失函数是,b的连续可导函数。
其中,M为误分类点的集合,这个损失函数其实就是感知机学习的经验风险函数。感知机学习的策略是在假设空间中选取使损失函数最小的模型参数 ,b就是感知机模型,对应于误分类点到分离超平面的总距离。
损失函数是非负的。如果没有误分类点,损失函数值是0。误分类点越少,误分类点离超平面越近,损失函数值就越小。一个特定的样本点的损失函数:在误分类时是参数 ,b的线性函数,在正确分类时是0。
感知机学习策略是极小化损失函数。为能够正确地分类,需要找到一个分离超平面将实例点完全正确地划分,要找到该超平面就要求解这个分离超平面即中的 参数,b;x是输入的特征向量。但是由于分类时不能确保可以完全正确地被分类而存在一定的误差,此时需要一个学习策略即是损失函数,使误差减小到最小,就是使损失函数最小。
在取值范围内学习到合适的值,使得模型对给定的输入特征向量计算得到的输出即预测值,尽可能的正确,这样的算法就是感知机模型的学习算法。
感知机是一种误差驱动的学习算法。如果预测正确,感知机算法将继续预测下一个实例;如果预测错误,算法将更新权重,即对进行更新。
感知机学习算法是误分类驱动的,具体采用随机梯度下降法。首先任意选取一个超平面,然后用梯度下降法不断地极小化损失函数致使最小值。极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
随机选取一个误分类点,对进行更新:
# 初始化参数 w, b
w = np.array([0.3, 0.7]) # 权值w
b = -0.3 # 偏置b
# 设定学习率 η
learning_rate = 0.6
# 对w,b进行更新
def update_weights(x, y, w, b):
w = w + learning_rate * y * x
b = b + learning_rate * y
return w, b
其中是步长,又称为学习率。通常情况下,学习算法通过设定学习率来用于调节更新参数时的幅度。通过迭代可以期待损失函数不断减小,直到为0。
解释:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其正确分类。
要使损失函数最小,使用的方法是梯度下降法。梯度下降就是对误分类点进行更新,从而改变参数,b的值,即找到分离超平面。在更新过程中,为了 限制 ,b的值变化幅度,设置一个学习率进行调节幅度大小。
每遍历一遍所有的训练实例称它为一个训练周期(epoch)。如果学习算法在一个训练周期内对所有的训练实例分类正确,则达到收敛状态。(学习算法并非一定保证能够收敛,因此学习算法需要一个超参数来指定算法终止之前能够完成的最大可训练周期。)
经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型,说明当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的;那么当训练数据集线性不可分时,感知机学习算法不收敛,迭代结果回发生震荡。但由于采用不同的初值或选取不同的误分类点,解可以不同;就是说感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。
基本想法:将表示为实例和标记的线性组合的形式,通过求解其系数而求得。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类,此时的实例对学校结果影响最大。与原始形式一样,感知机学习算法的对偶形式迭代是收敛的,存在多个解。
《统计学习方法》——第三章、K近邻法
http://t.csdn.cn/wBQabhttp://t.csdn.cn/wBQab
数据结构1800试题.pdf(C语言版):
数据结构代码实现(C语言版及考研党)-算法与数据结构文档类资源-CSDN下载内容概要:想必很多人在学习数据结构时都会很困惑于代码,特别是对小白来说,看别人得代码看不懂,自己得代更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_64215932/85248658
1.《统计学习方法》第二版--李航
2.《scikit-learn机器学习》第二版--加文.海克著,张浩然译
3.斯坦福机器学习PPT版