感知器算法
2015-09-14 21:31
225 查看
参考书籍:《统计学习方法.李航》
感知器模型
f(x) = sign( w*x + b )
其中x为实例的特征向量(输入),y表示实例的类别(输出),w叫作权值,b叫作偏置,sign为符号函数。
几何解释:w*x+b=0对应特征空间中的一个超平面S,其中w为法向量,b为斜距,这个超平面将特征空间划分为正、负两类。感知器学习就是由训练数据集求得感知器模型的模型参数w和b;感知器预测就是通过学习得到的感知器模型,对于新的输入实例给出其对应的输出类别。
数据集的线性可分性:给定一个数据集,如果存在某个超平面S(w*x+b=0)能够将数据集的正实例点和负实例点正确划分到超平面的两侧,则称数据集是线性可分数据集,否则为线性不可分。(如在二维空间中可以用一条直线将两类分开,三维空间中可以用一个平面将两个类别分开)
感知器学习策略
即定义一个损失函数并将损失函数极小化。
损失函数:误分类点到超平面的总距离。
任意一点x0到超平面S的距离:
根据推导得到损失函数为:
(忏悔Ing…我应当学下如何在csdn博客中插入漂亮的公式)
感知器学习算法
即求解损失函数式的最优化问题,方法选择的是随机梯度下降法。这意味着极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
训练过程:
(1)选取初值w0,b0;
(2)在训练集中选取数据(xi,yi);
(3)如果错误分类,即yi(w*xi+b)<0,则:w<-w+nyixi, b<-b+nyi,其中n(0~1)为学习率。
感知器学习算法在采用不同的初值或者选取不同的误分类点时,得到的解可以不同。
感知器算法的收敛性
当训练集线性可分时, 经过证明,误分类的次数K是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。当训练集线性不可分时,感知器学习算法不收敛,迭代结果会发生震荡。
针对多解情况:对分离超平面增加约束条件(如线性支持向量机)
感知器python实现
做了一下书上给的例题:
运行结果是:
写代码经验不足,只当练手….
感知器模型
f(x) = sign( w*x + b )
其中x为实例的特征向量(输入),y表示实例的类别(输出),w叫作权值,b叫作偏置,sign为符号函数。
几何解释:w*x+b=0对应特征空间中的一个超平面S,其中w为法向量,b为斜距,这个超平面将特征空间划分为正、负两类。感知器学习就是由训练数据集求得感知器模型的模型参数w和b;感知器预测就是通过学习得到的感知器模型,对于新的输入实例给出其对应的输出类别。
数据集的线性可分性:给定一个数据集,如果存在某个超平面S(w*x+b=0)能够将数据集的正实例点和负实例点正确划分到超平面的两侧,则称数据集是线性可分数据集,否则为线性不可分。(如在二维空间中可以用一条直线将两类分开,三维空间中可以用一个平面将两个类别分开)
感知器学习策略
即定义一个损失函数并将损失函数极小化。
损失函数:误分类点到超平面的总距离。
任意一点x0到超平面S的距离:
根据推导得到损失函数为:
(忏悔Ing…我应当学下如何在csdn博客中插入漂亮的公式)
感知器学习算法
即求解损失函数式的最优化问题,方法选择的是随机梯度下降法。这意味着极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
训练过程:
(1)选取初值w0,b0;
(2)在训练集中选取数据(xi,yi);
(3)如果错误分类,即yi(w*xi+b)<0,则:w<-w+nyixi, b<-b+nyi,其中n(0~1)为学习率。
感知器学习算法在采用不同的初值或者选取不同的误分类点时,得到的解可以不同。
感知器算法的收敛性
当训练集线性可分时, 经过证明,误分类的次数K是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。当训练集线性不可分时,感知器学习算法不收敛,迭代结果会发生震荡。
针对多解情况:对分离超平面增加约束条件(如线性支持向量机)
感知器python实现
做了一下书上给的例题:
# -*- coding: utf8 -*- w = []#权向量 b = 0 #偏置 n = 1 #学习率 lens = 0 #训练集合中数据长度 def judge(data): global w,b,n,lens ans = 0 for index in range(lens-1): ans += w[index]*data[index] ans += b ans *= data[lens-1] if ans <= 0: return False else: return True def update(data): global w,b,n,lens for index in range(lens-1): w[index] = w[index] + n*data[lens-1]*data[index] #因为文件中数据格式为输入+输出格式,每个数字用','分隔 b = b + n*data[lens-1] print 'After updating, w =',w,', b =',b if __name__ == '__main__': trainSet = open('train.txt','r') lens = len(trainSet.readline().split(',')) #输入+输出数据总长度,去掉换行符和分隔符,留下字符组成的列表 trainSet.seek(0) for index in range(lens-1): w.append(0) print 'Start training...' print 'In the beginning, w =',w,', b =',b check_result = False# 对整个数据集的分类情况进行检查的结果 while check_result == False: check_result = True for line in trainSet:#逐次读入训练数据,调整感知器系数 string = line.strip('\n').split(',') data = [int(i) for i in string] print 'The input is data =',data if judge(data) == False: update(data) check_result = False else: print 'Remaining, w =',w,', b =',b trainSet.seek(0) print '\n\nThe last result is: w =',w,', b =',b
运行结果是:
Start training... In the beginning, w = [0, 0] , b = 0 The input is data = [3, 3, 1] After updating, w = [3, 3] , b = 1 The input is data = [4, 3, 1] Remaining, w = [3, 3] , b = 1 The input is data = [1, 1, -1] After updating, w = [2, 2] , b = 0 The input is data = [3, 3, 1] Remaining, w = [2, 2] , b = 0 The input is data = [4, 3, 1] Remaining, w = [2, 2] , b = 0 The input is data = [1, 1, -1] After updating, w = [1, 1] , b = -1 The input is data = [3, 3, 1] Remaining, w = [1, 1] , b = -1 The input is data = [4, 3, 1] Remaining, w = [1, 1] , b = -1 The input is data = [1, 1, -1] After updating, w = [0, 0] , b = -2 The input is data = [3, 3, 1] After updating, w = [3, 3] , b = -1 The input is data = [4, 3, 1] Remaining, w = [3, 3] , b = -1 The input is data = [1, 1, -1] After updating, w = [2, 2] , b = -2 The input is data = [3, 3, 1] Remaining, w = [2, 2] , b = -2 The input is data = [4, 3, 1] Remaining, w = [2, 2] , b = -2 The input is data = [1, 1, -1] After updating, w = [1, 1] , b = -3 The input is data = [3, 3, 1] Remaining, w = [1, 1] , b = -3 The input is data = [4, 3, 1] Remaining, w = [1, 1] , b = -3 The input is data = [1, 1, -1] Remaining, w = [1, 1] , b = -3 The last result is: w = [1, 1] , b = -3
写代码经验不足,只当练手….
相关文章推荐
- Nuget发布与dll文件引用
- imfong.com,我的新博客地址
- linux内核学习(一步一步走)——内核概述
- PackageManager的使用
- 字符串类型
- Android获取手机最近任务列表
- 5、shader混合(Blending)、雾
- java网店系统JSPGOU 4.5
- HDU 4302 Holedox Eating (multiset模拟)
- StringBuffer
- 利用Spring创建定时任务
- android实现沉浸式状态栏
- 设置系统环境变量需要重启吗?
- 程序包管理
- Linux指令学习笔记(一)
- 乐观锁和悲观锁
- [疑似官泄] 某Ri牌示波器固件破解
- Java web访问MySql数据库分页查询
- 宏定义以及例子
- 揭秘云计算 为应用程序选择最佳云计算平台