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)的更多相关文章

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

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  2. 感知机(perceptron)概念与实现

    感知机(perceptron) 模型: 简答的说由输入空间(特征空间)到输出空间的如下函数: \[f(x)=sign(w\cdot x+b)\] 称为感知机,其中,\(w\)和\(b\)表示的是感知机 ...

  3. 感知机(perceptron)

  4. 神经网络 感知机 Perceptron python实现

    import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...

  5. 1. 感知机原理(Perceptron)

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  6. 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)

    最小二乘线性回归,感知机,逻辑回归的比较:   最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...

  7. 利用Python实现一个感知机学习算法

    本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...

  8. matlab神经网络实验

    第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  ...

  9. coursera机器学习笔记-神经网络,初识篇

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

随机推荐

  1. eclipse启动报错 java was started but returned exit code = -805306369

    前几天还工作的好好的eclipse昨天下午启动时突然报错 报错如图: 妹的,好端端突然报错,非常奇怪,关键还是返回一堆看不懂的东西,细看都是eclipse.ini里面的配置信息,看到熟悉的jdk,误以 ...

  2. mongodb添加用户和认证

    Mongodb默认启动是不带认证,也没有账号,只要能连接上服务就可以对数据库进行各种操作,这样可不行.现在,我们得一步步开启使用用户和认证. 第一步,我们得定位到mongodb的安装目录.我本机的是C ...

  3. windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime

    http://gmd20.blog.163.com/blog/static/168439232012113111759514/ 执行 10000000 次, 耗时 2258,369 微秒     Qu ...

  4. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  5. python-unexpected content storage modification出错

    提示以上错误,然后在pycharm中的文件内容和实际内容不一致 去我的文档-.PyCharm-system_cache,全部删除

  6. UVa 10250 The Other Two Trees

    还是读了很长时间的题,不过题本身很简单. 可以把四棵树想象成正方形的四个顶点,已知两个相对顶点的坐标,求另外两个坐标. 不过,原题可没直接这么说,中间需要一些小证明. 题中说有一个平行四边形然后分别以 ...

  7. 30个实用的Linux find命令

    除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易.本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令 . 首先,在你 ...

  8. hdfs工作原理

    一.NameNode和DataNode (1)NameNode NameNode的作用是管理文件目录结构,是管理数据节点的.NameNode维护两套数据:一套是文件目录与数据块之间的关系,另一套是数据 ...

  9. UVa 10048 Audiophobia【Floyd】

    题意:给出一个c个点,s条边组成的无向图,求一点到另一点的路径上最大权值最小的路径,输出这个值 可以将这个 d[i][j]=min(d[i][j],d[i][k]+d[k][j]) 改成 d[i][j ...

  10. Codeforces Round #291 (Div. 2)

    A 题意:给出变换规则,单个数字t可以变成9-t,然后给出一个数,问最小能够变成多少. 自己做的时候理解成了不能输出前导0,但是题目的本意是不能有前导0(即最高位不能是0,其余位数按照规则就好) 55 ...