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老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
随机推荐
- YTU 2620: B 链表操作
2620: B 链表操作 时间限制: 1 Sec 内存限制: 128 MB 提交: 418 解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
- java 反编译插件 JD-Eclipse 和 JD-IntelliJ
去官网 : http://jd.benow.ca/ 找到 JD-Eclipse 和 JD-IntelliJ,下载,前者安在eclipse上,后者安在as上.
- Spring 注解@Transactional
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- leetcode:Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- 我的ipad应用备份
听歌: 网易云音乐,QQ音乐 摄影: CameraConnect,Replay,PhotoBooth,PhotoCollage,画中画相机,Creative Shape, 简拼,玩图,PicsArt, ...
- npm使用过程中的一些错误解决办法及npm常用命令
node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...
- CSS之弧形阴影
简述 网页上经常会出现一些弧形的阴影效果,看起来很漂亮,下面我们来讲述下如何用CSS来实现一个弧形阴影. 简述 阴影 效果 注释 标题 效果 源码 合并 效果 源码 阴影 效果 首先实现一个简单的阴影 ...
- C#随机颜色和随机字母
//随机获取颜色 public System.Drawing.Color GetRandomColor() { Random RandomNum_First = new Random(Guid.New ...
- A. Puzzles CodeForces Round #196 (Div.2)
题目的大意是,给你 m 个数字,让你从中选 n 个,使得选出的数字的极差最小. 好吧,超级大水题.因为要极差最小,所以当然想到要排个序咯,然后去连续的 n 个数字,因为数据不大,所以排完序之后直接暴力 ...