感知机原理小结

感知机原理小结  感知机由Rosenblatt于1957年提出,是神经网络和支持向量机的基础。这里先简单介绍一下什么是感知机。本篇博客为《统计学方法》第二章和博客《感知机原理小结》的总结。感知机模型  感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,分别取+1+1+1和−1−1-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。这还是很…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

  感知机由Rosenblatt于1957年提出,是神经网络和支持向量机的基础。这里先简单介绍一下什么是感知机。本篇博客为《统计学方法》第二章和博客《感知机原理小结》的总结。

感知机模型

  感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,分别取 +1 + 1 1 − 1 二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。这还是很容易理解的,以二维平面为例,假设平面中存在着 ′ ∘ ′ × ′ × ′ 两种形状的点,感知机要做的是就是找到一条直线,将两类点分割开,如下图所示。这里要注意的是,感知机只适合于线性可分的数据,所以它是一个线性模型。

感知机原理小结

  假设现在我们训练集有 m m 个样本,每个样本对应于
n

n
维特征和一个二元类别输出:

x(i)=(x(i)1,x(i)2,,x(i)n),y(i)[1,+1] (i=1,2,,m) x ( i ) = ( x 1 ( i ) , x 2 ( i ) , … , x n ( i ) ) , y ( i ) ∈ [ − 1 , + 1 ]   ( i = 1 , 2 , … , m )

我们现在的目标就是找到一个超平面

S S
(为了表达简洁,后面都用向量形式了):


wx+b=0

w x + b = 0

其中

w w
是超平面的法向量,


b

b

是超平面的截距,这个超平面将特征空间划分为两个部分:

  对于

y(i)=1 y ( i ) = − 1
的样本,

wx(i)+b<0 w ⋅ x ( i ) + b < 0


  对于

y(i)=+1 y ( i ) = + 1
的样本,

wx(i)+b>0 w ⋅ x ( i ) + b > 0


从而实现分类的目的。这就是感知机模型,可以表示为从输入空间到输出空间的函数:

f(x)=sign(wx+b) f ( x ) = s i g n ( w ⋅ x + b )

其中权值

wRn w ∈ R n
和偏置

bR b ∈ R
是感知机模型参数,比如二维平面中

w w
就是一个二维向量。



s i g n ( x )

是符号函数,即

sign(x)={
+1,1,x0x<0
s i g n ( x ) = { + 1 , x ≥ 0 − 1 , x < 0

一旦学习到了

w w




b

的值,我们就可以利用

f(x(i)) f ( x ( i ) )
来判断新的样本属于哪一类别。

感知机学习策略

  感知机学习的目标是求得一个能够将训练集正类和负类样本点完全正确分开的分离超平面。为了确定超平面的参数 w w

b
,我们需要定义损失函数并将损失函数最小化。
  我们自然而然能想到的一个选择是最小化误分类点的总数,即 01 0 − 1 损失,但这样的损失函数不是参数 w,b w , b 的连续可导函数,难以优化。另一个选择是最小化误分类点到超平面 S S 的总距离,这正是感知机所采用的。
  先回顾一下空间任一点

x ( i )
到平面 wx+b w ⋅ x + b 的距离公式:

|wx(i)+b|w2 | w ⋅ x ( i ) + b | ‖ w ‖ 2

然后对于误分类的数据点 (x(i),y(i)) ( x ( i ) , y ( i ) ) ,总是满足 y(i)f(x(i))<0 y ( i ) f ( x ( i ) ) < 0 ,所以误分类点到超平面S的距离为:

y(i)(wx(i)+b)w2 − − y ( i ) ( w ⋅ x ( i ) + b ) ‖ w ‖ 2

记误分类点的集合为 M M ,那么所有误分类点到超平面

S
的总距离为:

1w2x(i)My(i)(wx(i)+b) − 1 ‖ w ‖ 2 ∑ x ( i ) ∈ M y ( i ) ( w ⋅ x ( i ) + b )

由于我们总能通过缩放 w,b w , b 使得在不改变超平面的的情况下使 w2=1 ‖ w ‖ 2 = 1 ,为了简化损失函数,我们不妨令 w2=1 ‖ w ‖ 2 = 1 ,于是得到了感知机的损失函数最终形式如下:

L(w,b)=x(i)My(i)(wx(i)+b)(1) (1) L ( w , b ) = − ∑ x ( i ) ∈ M y ( i ) ( w ⋅ x ( i ) + b )

这个损失函数就是感知机学习的经验风险函数,显然 L(w,b) L ( w , b ) 是非负的,如果没有误分类点,损失函数值为0。误分类点越少,误分类点距离超平面越近,损失函数值就越小。
  最后一句话总结,感知机学习的策略是在假设空间中选取使损失函数式(1)最小的模型参数 w,b w , b ,即感知机模型。

感知机学习算法

  感知机学习问题就是损失函数式(1)的最优化问题,可以用随机梯度下降求解。下面介绍一下感知机学习算法的原始形式和对偶形式。

原始形式

  给定训练集 T T ,感知机学习的目标是:



(1) min w , b L ( w , b ) = x ( i ) M y ( i ) ( w x ( i ) + b )

其中 M M 是训练集中误分类点的集合。感知机学习算法是误分类驱动的,具体采用SGD,首先随机选取一个超平面

w 0 , b 0
,然后每次随机选取一个误分类点进行梯度下降。
  损失函数的梯度由

wL(w,b)bL(w,b)=x(i)My(i)x(i)=x(i)My(i) ∇ w L ( w , b ) = − ∑ x ( i ) ∈ M y ( i ) x ( i ) ∇ b L ( w , b ) = − ∑ x ( i ) ∈ M y ( i )

给出。然后每轮迭代选取一个误分类点 (x(i),y(i)) ( x ( i ) , y ( i ) ) w,b w , b 进行更新:

wb=wηwL(w,b)=w+ηy(i)x(i)=bηbL(w,b)=b+ηy(i)(2) (2) w = w − η ∇ w L ( w , b ) = w + η y ( i ) x ( i ) b = b − η ∇ b L ( w , b ) = b + η y ( i )

其中 η η 为学习率。整个过程直观的解释是,每次遇到误分类点就调整 w,b w , b ,使超平面向误分类点的一侧移动,以减小改误分类点与超平面间的距离,直到超平面越过该点使其被正确分类。感知机学习算法存在许多解,这不仅依赖于 w,b w , b 初始值的选择,也依赖于误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件,这就是线性支持向量机的思想。
  最后提一下感知机的两点性质:
  (1) 当数据集线性可分的时候,学习算法一定收敛,即可以找到一个将数据点完全正确分开的超平面,而且误分类的次数是有上界的,即经过有限次的搜索一定可以找到最优分离超平面;
  (2) 当数据集不是线性可分的时候,学习算法不收敛,可能会发生震荡。

对偶形式

  这里顺便解释一下什么是对偶。对偶就是从一个不同的角度去解答相似问题,但是问题的解是相通的,甚至是一样一样的。那为什么感知机已经有原始形式了还要特地提出一个对偶形式?吃饱了撑着?不,这里引入对偶主要是为了减小计算量(特征维度越高越明显),至于为什么能减少计算量,等推导完对偶形式就自然而然出来了。
  感知机对偶形式的基本思路是,将 w w

b
表示为样本 x(i) x ( i ) 标记 y(i) y ( i ) 的线性组合的形式,这样就可以通过求解其系数而求得 w w

b

  不失一般性,我们可以假设初始值 w0,b0 w 0 , b 0 均为0,然后使用式(2)逐步调整 w,b w , b ,设现在迭代 n n 次,

w , b
关于 (x(i),y(i)) ( x ( i ) , y ( i ) ) 的增量分别是 αiy(i)x(i) α i y ( i ) x ( i ) αiy(i) α i y ( i ) ,最后学习到的 w,b w , b 可以分别表示为:

wb=i=1nαiy(i)x(i)=i=1nαiy(i)(3) (3) w = ∑ i = 1 n α i y ( i ) x ( i ) b = ∑ i = 1 n α i y ( i )

这里 αi=niη α i = n i η ni n i 表示到目前为止第 i i 个样本点由于误分类而进行更新的次数,即一开始每个样本的

n i = 0
,每次当这个样本误分类进行一次梯度下降更新时, ni n i 就加1。样本点更新次数越多,意味着它距离分离超平面就越近,也就越难正确分类。换句话说,这样的样本点对学习结果影响最大。
  然后,每次判断误分类点时,判断条件 y(i)(wx(i)+b)0 y ( i ) ( w ⋅ x ( i ) + b ) ≤ 0 就变成了 y(i)(nj=1αiy(j)x(j)x(i)+b)0 y ( i ) ( ∑ j = 1 n α i y ( j ) x ( j ) ⋅ x ( i ) + b ) ≤ 0 。这种形式有一个好处,就是在训练过程中,训练样本仅以内积 x(j)x(i) x ( j ) ⋅ x ( i ) 的形式出现。我们可以预先将样本内积算出来并以矩阵的形式存储,在后面的迭代过程中这个结果将会被重复利用。这个样本内积矩阵也就是所谓的Gram矩阵:

G=[x(i)y(j)]N×N G = [ x ( i ) ⋅ y ( j ) ] N × N

  现在来分析一下对偶为什么比原始形式好。
  (1) 第一个原因在上面提到了,就是计算量小。我们在每次迭代过程中都必须判断各个样本点是否误分类,在原始形式中我们利用 y(i)(wx(i)+b)0 y ( i ) ( w ⋅ x ( i ) + b ) ≤ 0 判断,因为每次 w w 都有变化,所以每次都需要计算特征向量

x ( i )
w w 的乘积。在对偶形式中我们利用

y ( i ) ( j = 1 n α i y ( j ) x ( j ) x ( i ) + b ) 0
来判断,这里索引Gram矩阵就能得到样本内积 x(j)x(i) x ( j ) ⋅ x ( i ) ,且Gram矩阵可以预先计算好,之后迭代中的计算就全部可以通过查表的方式得到了,这相比原始形式每次迭代都需要计算 wx(i) w ⋅ x ( i ) ,减少了大量的计算时间。
  (2) 内积形式很方便我们引入支持向量机的核方法,用来解决数据集线性不可分时的情况。
  
  最后总结一下感知机的对偶形式,它本质上就是用样本 x(i) x ( i ) 标记 y(i) y ( i ) 的线性组合去表达原始形式中的 w,b w , b ,如式(3)所示。这种形式的表达可以引入样本内积,减少计算量。然后对偶形式中要更新的模型参数就只有一个 αi=ηni α i = η n i 了,我们每次用一个误分类样本 x(i) x ( i ) 对参数进行更新,只需要将相应的 ni n i 加1,即

αi=η(ni+1)=αi+η(4) (4) α i = η ( n i + 1 ) = α i + η

这就是对偶形式的参数更新规则,和原始的随机初始化参数不同, αi α i 被初始化为0(因为 ni n i 一开始都为0)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184355.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 查看idea激活码-激活码分享

    (查看idea激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSWQi…

    2022年3月27日
    75
  • 罗马字符转换数字_数字变成字符串怎么改过来

    罗马字符转换数字_数字变成字符串怎么改过来今年在力扣上做了一道这个题,还算简单,主要是理解规则。解法也有很多种,我这里用的是常规解法,先将输入进来的字符串转换为字符数组,然后进行一系列操作。题目:罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,…

    2022年9月30日
    0
  • db2有没有rownum_row_number() over order by

    db2有没有rownum_row_number() over order byrank和rownumber都是自动生成序号,后面都可以跟partitionby分组和orderby排序。不同之处在于,rownumber在orderby后面的字段,排序字段数值相等时,rownumber字段依次递增。   rank在orderby后面的字段,排序字段数值相等时,rownumber都相同,直接跳到下一个不同的序号。selectrank

    2022年5月3日
    81
  • Android Handler机制 – MessageQueue如何处理消息[通俗易懂]

    Android Handler机制 – MessageQueue如何处理消息[通俗易懂]一次trouble-shooting最近在查看应用的线上日志统计时,发现一个MessageQueue.nativePollOnce()的记录,具体信息如下:atandroid.os.MessageQueue.nativePollOnce(Nativemethod)atandroid.os.MessageQueue.next(MessageQueue.java:325…

    2022年10月26日
    0
  • 细述Kubernetes和Docker容器的存储方式

    细述Kubernetes和Docker容器的存储方式

    2021年7月4日
    176
  • top命令查看内存信息_ubuntu查看cpu信息

    top命令查看内存信息_ubuntu查看cpu信息top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使…

    2022年9月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号