1. 感知机原理(Perceptron)

2. 感知机(Perceptron)基本形式和对偶形式实现

3. 支持向量机(SVM)拉格朗日对偶性(KKT)

4. 支持向量机(SVM)原理

5. 支持向量机(SVM)软间隔

6. 支持向量机(SVM)核函数

1. 前言

感知机是1957年,由Rosenblatt提出会,是神经网络和支持向量机的基础。

2. 感知机的原理

感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面

2.1 点到线的距离

公式中的直线方程为\(Ax+By+C=0\),点\(P\)的坐标为\((x_0,y_0)\)。
\[
d=\frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}}
\]

2.2 样本到超平面距离

我们假设超平面是\(h=w \cdot {x}+b\),其中\(w=(w_0,w_1,...w_m)\),\(x=(x_0,x_1,...x_m)\),样本点\(x^{'}\)到超平面的距离如下:
\[
d=\frac{w \cdot {x^{'}}+b}{||w||}
\]

2.2 超平面(Hyperplanes)

超平面是在空间\(R^d\)中的一个子空间\(R^{d-1}\)。

在2维空间中的超平面是一条线,在3维空间中的超平面是一个平面。

3. 感知机模型

感知机从输入空间到输出空间的模型如下:
\[
f(x)=sign(w \cdot {x}+b)
\]
\[
sign(x)= \begin{cases} -1& {x<0}\\ 1& {x\geq 0} \end{cases}
\]

3.1 感知机的损失函数

我们首先定义对于样本\((x_i,y_i)\),如果\(\frac{w\cdot {x_i}+b}{||w||}>0\)则记\(y_i=+1\),如果\(\frac{w\cdot {x_i}+b}{||w||}<0\)则记\(y_i=-1\)。

这样取y的值有一个好处,就是方便定义损失函数。因为正确分类的样本满足\(\frac{y_i(w\cdot {x_i}+b)}{||w||}>0\),而错误分类的样本满足\(\frac{y_i(w\cdot {x_i}+b)}{||w||}<0\)。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小

所以损失函数定义如下:
\[
L(w,b)=-\frac{1}{||w||}\sum_{x_i\in{M}}y_i(w\cdot {x_i}+b)
\]
其中M集合是误分类点的集合。

不考虑\(\frac{1}{||w||}\),就得到感知机模型的损失函数:
\[
L(w,b)=-\sum_{x_i\in{M}}y_i(w\cdot {x_i}+b)
\]

3.2 为什么可以不考虑\(\frac{1}{||w||}\)

网上有人说\(\frac{1}{||w||}\)是个定值,但是个人觉得平面不唯一,这个值肯定也会变。通过参考他人观点结合思考,觉得原因可以列为以下两点。

  1. \(\frac{1}{||w||}\)不影响\(y_i(w\cdot {x_i}+b)\)正负的判断,即不影响学习算法的中间过程。因为感知机学习算法是误分类驱动的,这里需要注意的是所谓的“误分类驱动”指的是我们只需要判断\(-y_i(w\cdot{x_i}+b)\)的正负来判断分类的正确与否,而\(\frac{1}{||w||}\)并不影响正负值的判断。所以\(\frac{1}{||w||}\)对感知机学习算法的中间过程可以不考虑。
  2. \(\frac{1}{||w||}\)不影响感知机学习算法的最终结果。因为感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0. 对应于\(-\frac{1}{||w||}\sum_{i\in{M}}y_i(w\cdot {x_i}+b)\),即分子为0.则可以看出\(\frac{1}{||w||}\)对最终结果也无影响。

综上所述,即使忽略\(\frac{1}{||w||}\),也不会对感知机学习算法的执行过程产生任何影响。反而还能简化运算,提高算法执行效率。

4. 感知机学习算法

感知机学习算法是对上述损失函数进行极小化,求得\(w\)和\(b\)。但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)。目标函数如下:
\[
L(w,b)=arg\min_{w,b}(-\sum\limits_{{{x}_{i}}\in{M}}{{{y}_{i}}(w\cdot {{x}_{i}}+b)})
\]

4.1 原始形式算法

输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)

输出:\(w,b\);感知机模型\(f(x)=sign(w\cdot {x}+b)\)

  1. 赋初值 \(w_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(w\cdot {x_i}+b)<=0\)则更新
    \[
    w={w+\eta{y_ix_i}}
    \]
    \[
    b={b+\eta{y_i}}
    \]
  4. 转到2,直到训练集中没有误分类点

4.2 对偶形式算法

由于\(w,b\)的梯度更新公式:

\[
w={w+\eta{y_ix_i}}
\]
\[
b={b+\eta{y_i}}
\]

我们的\(w,b\)经过了\(n\)次修改后的,参数可以变化为下公式,其中\(\alpha = ny\):

\[
w=\sum_{x_i\in{M}}\eta{y_ix_i}=\sum_{i=1}^n\alpha_iy_ix_i
\]
\[
b=\sum_{x_i\in{M}}\eta{y_i}=\sum_{i=1}^n\alpha_iy_i
\]
这样我们就得出了感知机的对偶算法。

输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)

输出:\(\alpha,b\);感知机模型\(f(x)=sign(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x}+b)\)

其中\(\alpha=(\alpha_1,\alpha_2,...,\alpha_n)^T\)

  1. 赋初值 \(\alpha_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x_i}+b)<=0\)则更新
    \[
    \alpha_i={\alpha_i+\eta}
    \]
    \[
    b={b+\eta{y_i}}
    \]
  4. 转到2,直到训练集中没有误分类点

为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵

\[
G=[x_i,x_j]_{N×N}
\]

4.3 原始形式和对偶形式的选择

  • 在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速。
  • 在向量个数(样本数)过多时,每次计算累计和就没有必要,应选择原始算法

5. 训练过程

我们大概从下图看下感知机的训练过程。

线性可分的过程:

线性不可分的过程:

6. 小结

感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。

1. 感知机原理(Perceptron)的更多相关文章

  1. 感知机(perceptron)原理总结

    目录 1. 感知机原理 2. 损失函数 3. 优化方法 4. 感知机的原始算法 5. 感知机的对偶算法 6. 从图形中理解感知机的原始算法 7. 感知机算法(PLA)的收敛性 8. 应用场景与缺陷 9 ...

  2. (数据科学学习手札34)多层感知机原理详解&Python与R实现

    一.简介 机器学习分为很多个领域,其中的连接主义指的就是以神经元(neuron)为基本结构的各式各样的神经网络,规范的定义是:由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系 ...

  3. [笔记-统计学习方法]感知机模型(perceptron) 原理与实现

    前几天认把感知机这一章读完了,顺带做了点笔记 现在把笔记做第三次的整理 (不得不说博客园的LaTex公式和markdown排版真的不太舒服,该考虑在服务器上建一个博客了) 零.总结 适用于具有线性可分 ...

  4. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  5. Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

    1. Frank Rosenblatt 首先介绍的是神经网络的开山祖师,先放张图拜拜 Frank Rosenblatt出生在纽约,父亲是医生,其1956年在Cornell大学拿到博士学位后,留校任教, ...

  6. 用感知机(Perceptron)实现逻辑AND功能的Python3代码

    之所以写这篇随笔,是因为参考文章(见文尾)中的的代码是Python2的,放到Python3上无法运行,我花了些时间debug,并记录了调试经过. 参考文章中的代码主要有两处不兼容Python3,一个是 ...

  7. 感知机(perceptron)

    二类分类的线性分类模型,属于判别模型,利用梯度下降法对损失函数进行极小化求得感知机模型分为原始形式和对偶形式,是神经网络和支持向量机的基础 由输入控件到输出控件的如下函数: f(x)=sign(W.X ...

  8. 【分类算法】感知机(Perceptron)

    0 - 算法描述 感知机算法是一类二分类算法,其问题描述为,给定一个训练数据集 $$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},$$ 其中$x_i\in \m ...

  9. 感知机:Perceptron Learning Algorithm

    感知机是支持向量机SVM和神经网络的基础 f = sign(wx+b) 这样看起来好像是LR是差不多的,LR是用的sigmoid函数,PLA是用的sign符号函数,两者都是线性分类器,主要的差别在于策 ...

随机推荐

  1. ANDROID开机动画分析

    开机动画文件:bootanimation.zip在system\media文件夹下动画是由系列图片连续刷屏实现的..bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩,包含 ...

  2. WCF Service中HttpContext.Current为null的解决办法

    1. 在hosting WCF的web.config中加入: <system.serviceModel> <serviceHostingEnvironment aspNetCompa ...

  3. jQuery.ajax发送image请求格式

    1\请求端 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head run ...

  4. IDEA使用笔记(一)——使用前的基本设置

    前言:记忆不好,有些东西需要的时候又需要找一找,那就不如让“纸和笔”来帮忙记录一下啦!到时候查找也方便,而且是自己的东西印象更加的深刻,说不定还能帮助到他人多好玩的事情! 软件的下载.安装就不记啦!自 ...

  5. 【Linux】数据流重导向(后篇)

    1)/dev/null 垃圾桶黑洞装置与特殊写法 想象一下,如果我知道错误信息会发生,所以要将错误信息忽略掉而不显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/nul ...

  6. docker-compose教程(安装,使用, 快速入门)

    1.Compose介绍Docker Compose是一个用来定义和运行复杂应用的Docker工具.一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compose不再需要使用she ...

  7. UITableView/UIScrollView 不能响应TouchBegin 的处理 及窥见 hitTest:withEvent:

    重写touchBegin 方法是不行的,在UITableView/UIScrollView 解决方案 重写hitTest:withEvent:  在他们的子类中 - (UIView *)hitTest ...

  8. 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析

    前言 Swift 语言,怎么说呢,有一种先接受后排斥.又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift差点儿占领了多半,而国内尽管出现非常多相关技术介绍和教程,可是在真正项目开发中使用的占领非 ...

  9. (原创)用c++11打造好用的variant

    variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它.它的具体类型是在初始化赋值时确定.boost中的variant的基本用法: typedef variant<in ...

  10. django rest_framework入门二-序列化

    在前一节中,我们已经粗略地介绍了rest_framework的作用之一序列化,下面我们将详细探究序列化的使用. 1.新建一个app snippets python manage.py startapp ...