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老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
随机推荐
- 利用SOLR搭建企业搜索平台 之——solr的查询语法
1. 首先假设我的数据里fields有:name, tel, address 预设的搜寻是name这个字段, 如果要搜寻的数据刚好就是 name 这个字段,就不需要指定搜寻字段名称. 2. 查询规 ...
- ACdream 1735 输油管道 (排序)
http://acdream.info/problem?pid=1735 官方题解:http://acdream.info/topic?tid=4246 因为主干线是平行于x轴的直线,那么跟x坐标其实 ...
- Android eMMC Booting
Android eMMC Booting Contents [hide] 1 eMMC binaries 1.1 Creating the GPT table 1.2 Modifying .IMG F ...
- Form.ShowDialog和Form.DialogResult
The dialog result of a form is the value that is returned from the form when it is displayed as a mo ...
- [CF660C]Hard Process(尺取法)
题目链接:http://codeforces.com/problemset/problem/660/C 尺取法,每次遇到0的时候补一个1,直到补完或者越界为止.之后每次从左向右回收一个0点.记录路径用 ...
- SQL语句方法语法总结(三)
1.时间相关的操作 月份.星期.日期.时间格式转换.第几周 ,'2014-4-1') as '时间间隔', --在所给时间上加上时间间隔,转换成DATETIME DATEDIFF(DAY,'2014- ...
- 每天一个Linux命令(7): cp
cp命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或目录 ...
- QR二维码(转)
二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...
- 15个必须知道的chrome开发者技巧(转)
15个必须知道的chrome开发者技巧 在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟 ...
- SQL利用Case When Then多条件判断
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 WHEN 条件4 THEN 结果4 ....... ...