20151227感知机(perceptron)
1 感知机
1.1 感知机定义
感知机是一个二分类的线性分类模型,其生成一个分离超平面将实例的特征向量,输出为+1,-1。导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,从而求得此超平面,该算法有原始形式和对偶形式。
定义:假设输入空间是\(\chi \subseteq \mathbb{R}^n\),输出空间是{+1,-1},输入\(x \in \chi \)表示实例的特征向量,对应于输入空间的点;输出\(y \in Y\)表示实例的类别。则由输入空间到输出空间的如下函数f(x) = sign(wx+b)为感知机。其中\(w \in \mathbb{R}^n\)叫做权值,\(b \in \mathbb{R}\)叫做偏置,sign是符号函数即:
\[sign \left ( x \right ) = \left\{ \begin{matrix}
+1,x \geqslant 0 \\
-1, x < 0
\end{matrix}\right.\]
很明显可以看到,感知机的几何解释就是线性方程wx+b=0是一个超平面,将点分成+1,-1两类。
1.2 感知机损失函数
那么如何确定这个分离超平面呢?首先我们假设数据集线性可分,在这个目标下再定义一个损失函数,到时候将损失函数极小化就可以得到分离超平面了。
为了使得w,b联系可导,在这里采用的损失函数是误分类点到超平面的总距离。
①点\(x_0\)到超平面S距离为:
\[\frac{1}{\left \| w \right \|} \left| w \cdot x_0 +b \right| \]
②对于误分类点到超平面S距离为:
\[-\frac{1}{\left \| w \right \|} y_i \left| w \cdot x_0 +b \right| \]
③误分类点到超平面S距离之和为(其中M为误分类点的集合):
\[-\frac{1} {\left \| w \right \|} \sum_ {x_i \in M} { y_i \left| w \cdot x_0 +b \right| }\]
④则感知机损失函数定义为:
\[-\sum_{x_i \in M} { y_i \left| w \cdot x_0 +b \right|}\]
2 感知机求解
2.1 原始形式
给定训练数据集\(T=\left \{ \left(x_1,y_1\right),\left(x_2,y_2\right),\cdots,\left(x_N,y_N\right) \right \}\)
其中,\(x_i \in \chi = \mathbb{R}^n\),\(y_i \in Y= \left\{ -1,1 \right\}\),\(i=1,2,\cdots,N\),求参数w,b,使其成为以下函数极小化问题的解。其中M为误分类点的集合。
\[\underset{w,b}{min}L\left(w,b \right) = -\sum_{x_i \in M}{y_i \left( w \cdot x_i +b \right)}\]
这里采用随机梯度下降法来求解w,b。每次随机使用一个误分类点使其梯度下降。
算法步骤:
1. 选取初值w0,b0
2. 在训练集中选取数据\(\left( x_i,y_i \right)\)
3. 如果\(y_i \left( w \cdot x_i +b \right) \leqslant 0\),则:(此处\(\eta\)为学习率)
\[w \leftarrow w + \eta y_i x_i\]\[b \leftarrow b + \eta y_i\]
4. 到(2),直到训练集中没有误分类点。(此处有个疑问,如果不能线性可分怎么办,就是始终有个误分类点怎么搞?)
按照以上步骤可以发现如果有点被分错了,则会使得分离超平面超这个点这侧移动,使得距离减少。具体的代码如下。直接运行可以得到分隔的超平面和原始数据点。
# -*- coding:utf-8 -*-
########################################
# perceptron: perceptron
# Author : xuke
# Date : 2015-12-16
########################################
import matplotlib.pyplot as plt
import numpy
def sign(x,w,b):
res = b
for i in xrange(len(x)-1):
res += x[i+1]*w[i]
return res
def perceptron(data):
w = [-1]*(len(data[0])-1)
b = 2
i = 0
end_flag = 1000
end_num = 0
learn_rate=2
while(i< len(data) and end_num<end_flag):
d = data[i]
end_num += 1
if sign(d,w,b)*d[0]<=0:
b += learn_rate*d[0]
w = [ w1+d1 for w1,d1 in zip(w, [t*d[0]*learn_rate for t in d[1:]])]
i = 0
else:
i += 1
print "iter:",end_num
return w,b
def draw_line(data,w,b):
flag = ['b*','rs','g+','sb', 'db', '<b', 'pb']
for i in data:
plt.plot(i[1],i[2],flag[i[0]])
x = numpy.linspace(-10,10,100)
plt.plot(x,(b+w[0]*x)*(-1)/w[1])
plt.show()
if __name__=='__main__':
data=[
[1,4,3],
[-1,1,1],
[-1,3,1],
[1,1,3],
[1,4,6],
[-1,-1,3],
[1,3,9],
[-1,4,1],
[1,4,4],
]
w,b = perceptron(data)
print w,b
draw_line(data,w,b)
2.2 对偶形式
我们在这里可以分析下这个公式:
\[w \leftarrow w + \eta y_i x_i\]\[b \leftarrow b + \eta y_i\]
很明显我们可以得到:
\[w=\sum_{i=1}^{N}{\alpha_i y_i x_i}\] \[b=\sum_{i=1}^{N}{\alpha_i y_i}\]
如果\(\eta=1\),则这里的\(\alpha_i\)表示第i个点被分错的次数,如果这个值越大,则说明这个点越难被分对。
则这里我们可以拿出对偶形式:
输入:线性可分的数据集\(T=\left \{ \left(x_1,y_1\right),\left(x_2,y_2\right),\cdots,\left(x_N,y_N\right) \right \}\)
其中,\(x_i \in \mathbb{R}^n\),\(y_i \in Y= \left\{ -1,1 \right\}\),\(i=1,2,\cdots,N\),学习率\(\eta \left( 0 < \eta \leqslant 1\right)\)
输出:\(\alpha,b\);其中\(\alpha=\left( \alpha_1,\alpha_2,\cdots,\alpha_N \right)^T\)感知机模型\[f \left( x \right) = sign\left( \sum_{j=1}^{N}{\alpha_j y_j x_j \cdot x +b}\right)\]
1. \(\alpha \leftarrow 0,b\leftarrow 0\)
2. 在训练集中选取数据\(\left( x_i,y_i\right)\)
3. 如果\(y_i \left( \sum_{j=1}^{N}{\alpha_jy_jx_j \cdot x_i +b} \right) \leqslant 0\)
\[\alpha_i \leftarrow \alpha_i + \eta\] \[b \leftarrow b + \eta y_i\]
4. 转至(2)直到没有误分类数据
对偶形式中训练实例是以内积形式出现,在计算中可以提前计算内积矩阵Gram并存储。
3 其他
3.1疑问1:为什么单个感知机不能解决异或问题?
这里参考果壳网友回答,因为异或问题转换成二维平面就是一个分类问题。
-(0,1) +(1,1)
+(0,0) -(1,0)
但是上面的问题是无法线性可分的,因此感知机在这里不能解决异或问题。当然了单个感知机无法解决异或问题,但是多个的是能够解决的。
参考文献:
1. 《统计学习方法》李航
2. 感知机:http://blog.csdn.net/bingduanlbd/article/details/24468885
3. 为什么感知机(单层神经网络)不能解决异或问题:http://www.guokr.com/blog/793310/
20151227感知机(perceptron)的更多相关文章
- 2. 感知机(Perceptron)基本形式和对偶形式实现
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 感知机(perceptron)概念与实现
感知机(perceptron) 模型: 简答的说由输入空间(特征空间)到输出空间的如下函数: \[f(x)=sign(w\cdot x+b)\] 称为感知机,其中,\(w\)和\(b\)表示的是感知机 ...
- 感知机(perceptron)
- 神经网络 感知机 Perceptron python实现
import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...
- 1. 感知机原理(Perceptron)
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)
最小二乘线性回归,感知机,逻辑回归的比较: 最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...
- 利用Python实现一个感知机学习算法
本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...
- matlab神经网络实验
第0节.引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set ...
- coursera机器学习笔记-神经网络,初识篇
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
随机推荐
- 【HDOJ】5446 Unknown Treasure
1. 题目描述题目很简单,就是求$C(n,m) % M$. 2. 基本思路这是一道应用了众多初等数论定理的题目,因为数据范围较大因此使用Lucas求$C(n,m) % P$.而M较大,因此通过$a[i ...
- [CF580B]Kefa and Company(滑动窗口)
题目链接:http://codeforces.com/problemset/problem/580/B 某人有n个朋友,这n个朋友有钱数m和关系s两个属性.问如何选择朋友,使得这些朋友之间s最大差距小 ...
- Struts2 原理
.Struts2原理 .Struts 1 原理 .Struts1 和webwork的关系 .HttpServletRequest Struts2原理
- 解决 border-radius 元素在应用了 transform 的子元素 时overflow:hidden 失效的问题
受大家启迪,于是最近深入研究了一下Css3中的一些属性.之中也是碰到了个不为我知的问题,在这里特此总结并与大家分享. 问题重现:在父元素上应用了 border-radius 的圆角属性.加上 ove ...
- HDU 1494 跑跑卡丁车
很无爱的一道题. 题解都看得一知半解的. acm之家的题解,留着以后慢慢体会: 把这题转化为背包模型,每个%20能量算一个单位,最多有15个,如果大于5个有一个加速卡,如果大于10个有2个加速卡,如果 ...
- 51nod1225 余数之和
打表可以看出规律.分块求就可以了. #include<cstdio> #include<cstring> #include<cctype> #include< ...
- Web程序员最常用的11款PHP框架
PHP框架是Web程序员和开发人员最为有用的工具. PHP框架可以帮助用户更快地开发项目. 今天我将为开发人员带来几款最好的PHP框架,希望能对你有用. 1.Agavi Agavi是一款强大的,可扩展 ...
- Python中字符串的使用
这篇文章主要介绍python当中用的非常多的一种内置类型——str.它属于python中的Sequnce Type(序列类型).python中一共7种序列类型,分别为str(字符串),unicode( ...
- 决定undo表空间的大小
1.查询每秒最高需要的undo的数据块[每个块8k大小] sys)) from v$undostat; )) --------------------------------------------- ...
- 关于用netbeans和xdebug调试php的配置
之前用过一段时间在apache,netbeans下通过xdebug调试.感觉不错,最近事情不多想从新配置下,是基于最新版本的php5.4做的,后来参考了下xdebug的官网说明完成的.官网地址:htt ...