0. 假装有一个前言

前几天看到有人转李航老师的《统计学习方法》python 3.6实现,突然发现书我是看了一半了,代码却只写过第三章的

近邻法。(不要问我为什么现在才看了一半,也不要问我为什么不一边看一边写)

1. 感知机原理

赶只鸡(划掉)

感知机(Perceptron)是二分类的线性分类模型,只适用于线性可分的二分类问题。

线性二分类问题

输入

输出

模型类型

参数意义

特征向量

类别(

)

判别模型

超平面参数

感知机的损失函数为所有误分类点到分类超平面的距离之和,因此算法是误分类驱动的,正确分类的点不会对算法的结果做出贡献。

2. 感知机学习算法的两种形式

2.1 原始形式

使用随机梯度下降法,针对每个误分类使其梯度下降。

算法2.1_感知机学习算法的原始形式

输入:训练数据集

;学习率

输出:

;感知机模型

.

1 选取初值

2 在训练集中选取数据

3 如果

4 如果训练集中存在误分类点,转至 2;否则,结束

def trainOri(self,yita = 0.1):

self.w = self.w0

self.b = self.b0

misDivision = True

self.yita = yita

self.k = 0

while misDivision:

for it in range(len(self.data)):

if self.label[it] * (np.dot(self.w, self.data[it]) + self.b) <= 0:

self.w += self.yita * self.label[it] * self.data[it]

self.b += self.yita * self.label[it]

self.k += 1

break

if it == len(self.data) - 1:

misDivision = False

原始形式这里没有问题,对1000个2维数据进行分类使用了

,更新次数为

PerceptronOri

2.2 对偶形式

使用随机梯度下降法,针对每个误分类使其梯度下降。

算法2.2_感知机学习算法的对偶形式

输入:训练数据集

;学习率

输出:

;感知机模型

.

1 选取初值

2 在训练集中选取数据

3 如果

4 如果训练集中存在误分类点,转至 2;否则,结束

def trainDual(self, yita = 1):

self.alpha = self.alpha0

self.beta = self.beta0

gram = []

for it in self.data:

temp = []

for ot in self.data:

temp.append(np.dot(it,ot))

gram.append(temp)

misDivision = True

self.yita = yita

self.k = 0

self.kk = 0

while misDivision:

for it in range(len(self.data)):

temp = 0

self.kk +=1

if self.label[it] * (sum([self.alpha[i] * self.label[i] * gram[i][it] for i in range(len(self.data))]) + self.beta) <= 0:

self.alpha[it] += self.yita

self.beta += self.yita * self.label[it]

self.k += 1

break

if it == len(self.data) - 1:

misDivision = False

对偶形式这里问题就大了,等了一分钟还以为是条件给错进入死循环了,反复检查确认没有问题,心想,跑去吧(其实去刷知乎了)。于是就有了下面这张图:

PerceptrDual

等一下,说好的使用Gram矩阵可以降低运算量呢?同样更新了七千多次为什么你跑了三分钟啊?!差了2000倍有木有啊!

emm

2.3 问题分析

1) 从编程角度分析

冷静分析一下,Gram矩阵计算时间只需

基本可以忽略不记,由于刚刚只统计了参数更新次数,我们重新统计一下两种算法第三步的判别步骤:

判别步骤

原始算法判别

次,更新参数

次,耗时

对偶算法判别

次,更新参数

次,耗时

由算法2.1,2.2可知,参数更新基本不消耗时间,也即大部分时间用于判别步骤。原始算法平均耗时

,对偶算法平均耗时

。这中间也就差了,额,1931倍吧。

继续冷静分析,算法2.2中第三步计算量大的主要原因是有一个求积再求和的过程,这个过程也可以当作向量内积来计算,这样就实现了在一次参数更新前只计算一次

。这个部分书中没有提及,可能因为不属于算法而是计算方法的一部分吧。

更新对偶算法如下:

def trainDual(self, yita = 1):

self.alpha = self.alpha0

self.beta = self.beta0

gram = []

for it in self.data:

temp = []

for ot in self.data:

temp.append(np.dot(it,ot))

gram.append(temp)

gramA = np.array(gram)

misDivision = True

self.yita = yita

self.k = 0

self.kk = 0

while misDivision:

ay = np.array([self.alpha[x] * self.label[x] for x in range(len(self.alpha))])

for it in range(len(self.data)):

temp = 0

self.kk +=1

if self.label[it] * (np.dot(ay, gramA[it]) + self.beta) <= 0:

self.alpha[it] += self.yita

self.beta += self.yita * self.label[it]

self.k += 1

break

if it == len(self.data) - 1:

misDivision = False

同样,我们使用1000个2维数据进行测试,结果如下:

更新对偶算法之后

虽然对偶算法还是比原始算法慢了20倍左右,但最起码两者是接近量级的运行时间了。

2)从算法角度分析

样本包括三个属性:个数,特征向量尺寸和标签。对于感知机,标签与数据个数相同。Gram矩阵是将样本的特征向量两两做内积,当特征向量尺寸较大时对偶算法应该可以比原算法简化更多的计算量。

我们将数据由1000个2维数据提升为1000个1000维数据,此时两种算法结果对比如下:

1000维数据

虽然对偶算法依然慢于原始算法,但两者间的差距已经由30倍缩小到了2.5倍。

我们继续增加样本的维数,将维数提高到丧(gan)心(de)病(piao)狂(liang)的500,000维,为了硬盘着想,我们这次只生成了100条数据。

绝不会用记事本打开的文本文档

最终结果是,原始算法速度依然是对偶算法的两倍左右。

50w维数据

大概是我代码能力太烂?可能还需要进一步优化。另外1957年有500,000维的数据需要处理吗?

代码

P.S. 大概也许有可能还会更新

python计算学习,《统计学习方法》的Python实现:(1)感知机相关推荐

  1. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  2. 缺失数据em算法python_重磅!李航《统计学习方法》Python 代码更新,适应第二版!...

    重磅!李航<统计学习方法>Python 代码更新,适应第二版! 点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 李航的<统计 ...

  3. 12个python超强学习网站!加python书籍推荐!( 入门python自学推荐!建议收藏!)

    python学习网站 一.python学习网站 1 CSDN 2 Python123 3 python中文学习大本营 4 python开发者社区 5 github 6 python学习网 7 pyth ...

  4. 复现经典:《统计学习方法》第 2 章 感知机

    本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...

  5. 机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)

    之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ). 但是,在更 ...

  6. python读取日志统计ip_使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  7. python 计算累计人数_免费Python入门课程,看到就是赚到~

    前言 人生苦短,我用python.当下最火的编程语言,你是否也想试试? Python发行于1991年,广泛应用于系统管理任务的处理和WEB编程.创始人阿姆斯特丹Guido为了打发圣诞节的无趣,决心开发 ...

  8. Python 计算总分数和平均分 - Python零基础入门教程

    目录 一.Python 计算总分数和平均分源码 二.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.Python 计算总分数和平 ...

  9. PYTHON 100days学习笔记007-1:python数据类型补充(1)

    目录 day007:python数据类型补充(1) 1.数字Number 1.1 Python 数字类型转换 1.2 Python 数字运算 1.3 数学函数 1.4 随机数函数 1.5 三角函数 1 ...

  10. 字字谏言!Python入门学习教程:关于Python不得不说的事儿

    作为程序员,你肯定遇到过这样的领导: "别人还没走,你先走了不合适吧." "不能确定功劳,总得有苦劳吧!你看别人9点谁走了?" 说到996,这很有可能是诱因之一 ...

最新文章

  1. 如何更新 Exchange2003 SP2 中的智能邮件筛选器版本
  2. hazelcast 使用_使用HazelCast进行Hibernate缓存:JPA缓存基础知识
  3. Eclipse的Mockito模板
  4. 修改Linux主机名和IP
  5. 一套漂亮的Bootstrap模板
  6. 化繁就简 · 万物互联,华为云All-Connect企业级云网络正式发布
  7. 那些炫酷的特效--QQ空间+VUE
  8. 安卓应用安全指南 4.7 使用可浏览的意图
  9. 【分治】LeetCode 50. Pow(x, n)
  10. oracle中print,oracle中print_table存储过程实例介绍
  11. Flask 使用abort方法返回http错误码、http错误响应信息
  12. Pano2VR制作热区激活面板
  13. 英雄联盟轮播图手动轮播
  14. html怎么改变网页整体的大小,html设置浏览器大小
  15. 推荐算法(一)——音乐歌单智能推荐
  16. 国密算法SM2实现 vue+C#
  17. 【信息系统集成】-成本管理错题
  18. 7-9 彩虹瓶 (25 分)(c++)
  19. 云服务器部署项目环境搭建
  20. 《Effective Java》——学习笔记(泛型枚举和注解)

热门文章

  1. PyTorch 轻松节省显存的小技巧
  2. linux下 OOB 炸弹的制作
  3. CentOS7安装 SGE
  4. 理论力学判断自由度的问题
  5. 表白神器java代码_java制作七夕表白神器的方法
  6. HTML+CSS(婚纱公司网站)静态网页设计
  7. go 并发goroutines,channal
  8. 为什么计算机连不上无线网络,笔记本无线连不上是什么原因_为什么笔记本电脑连不上wifi-win7之家...
  9. 一个简单的多线程实现
  10. Jenkins上配置Robot Framework测试邮件通知模板