机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
关键字:朴素贝叶斯、python、源码解析
作者:米仓山下
时间:2018-10-25
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
git@github.com:pbharrin/machinelearninginaction.git
*************************************************************
一、朴树贝叶斯分类(bayes)
#朴素贝叶斯实现文本分类原理:
bayes公式:P(ci|w)=P(w|ci)P(ci)/p(w)
首先计算侮辱性言论和非侮辱性言论文档出现的概率P(ci)即P(1)、P(0)的概率;接着计算P(w|ci),假设词的出现相互独立(也是朴素贝叶斯“朴素”的含义),p(w0,w1,…wN|c1)=p(w0|c1)p(w1|c1)…p(wN|c1),然后利用公式计算在该词向量下属于不同类别概率,比较返回概率最大的类别
训练:P(w|ci)——分类ci下词向量w的条件概率,P(w|ci)=p(w0,w1,…wN|c1)=p(w0|c1)p(w1|c1)…p(wN|c1);P(ci)——分类ci出现的概率;p(w)——词向量w出现的概率(每个词出现的概率之积,是一个定值?)求解:P(ci|w)——词向量w下分类为ci的条件概率
测试:利用公式计算在该词向量下属于不同类别概率,比较返回概率最大的类别
--------------------------------------------------------------
#朴素贝叶斯实现文本分类,训练函数
#input:trainMatrix——训练样本(词集模型,词出现与否分别为1和0),trainCategory——类别向量
#output:p0Vect——[2],p1Vect——[1],pAbusive——样本为侮辱性P(1)的概率
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix) #训练样本数目
numWords = len(trainMatrix[0]) #特征个数(词汇表大小)
pAbusive = sum(trainCategory)/float(numTrainDocs) #样本为侮辱性P(1)的概率,即P(ci)
p0Num = ones(numWords); p1Num = ones(numWords) #初始化概率,[注1]
p0Denom = 2.0; p1Denom = 2.0
for i in range(numTrainDocs): #遍历样本
if trainCategory[i] == 1: #侮辱性样本
p1Num += trainMatrix[i] #侮辱性词向量之和
p1Denom += sum(trainMatrix[i]) #侮辱性样本中,出现的词汇总数
else: #非侮辱性样本
p0Num += trainMatrix[i] #向量之和
p0Denom += sum(trainMatrix[i])#非侮辱性样本,出现的词汇总数
p1Vect = log(p1Num/p1Denom) #[1]侮辱性样本中,词汇表每个词汇出现概率,即P(w|ci),[注1]
p0Vect = log(p0Num/p0Denom) #[2]非侮辱性样本中,词汇表每个词汇出现概率,同为P(w|ci)
return p0Vect,p1Vect,pAbusive
#注:利用贝叶斯分类器对文档进行分类时,要计算多个概率的乘积以获取文档属于某个类别的概率(p(w0|c=1)p(w1|c=1)p(w2|c=1)),若其中一个概率为零则整体为零,为避免影响,将p0Num,p1Num初始化为1,将分母p0Denom初始化为2;另外为避免太多小数相乘造成数据下溢,因此对其取对数(f(x)与ln(f(x))具有相同的单调性),并有ln(a*b)=ln(a)+n(b),将其后的乘积运算转换为加和
#朴素贝叶斯分类测试函数
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): #计算属于不同类别的概率并进行比较
p1 = sum(vec2Classify * p1Vec) + log(pClass1) #计算概率p(w0|c1)p(w1|c1)…p(wN|c1)p(c1),
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) #因为进行了对数运算,乘积运算转换为加和
if p1 > p0:
return 1
else:
return 0
-------------------------------------------------------------
测试:
>>> import bayes
>>> from numpy import *
>>> listOPosts,listClasses=bayes.loadDataSet() #读取训练数据集及类别标签
>>> listOPosts
[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
>>> listClasses
[0, 1, 0, 1, 0, 1]
>>> myVocalList=bayes.createVocabList(listOPosts) #创建词汇表
>>> myVocalList
['cute', 'love', 'help', 'garbage', 'quit', 'I', 'problems', 'is', 'park', 'stop', 'flea', 'dalmation', 'licks', 'food', 'not', 'him', 'buying', 'posting', 'has', 'worthless', 'ate', 'to', 'maybe', 'please', 'dog', 'how', 'stupid', 'so', 'take', 'mr', 'steak', 'my']
>>> trainMat=[]
>>> for postindoc in listOPosts: #将训练数据集转换为词向量形式
... trainMat.append(bayes.setOfWords2Vec(myVocalList,postindoc))
...
>>> trainMat
[[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0], [1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]]
>>> p0v,p1v,pab=bayes.trainNB0(trainMat,listClasses)#计算条件概率及侮辱性文档出现的概率p(1)
>>> p0v,p1v,pab
(array([-2.56494936, -2.56494936, -2.56494936, -3.25809654, -3.25809654,
-2.56494936, -2.56494936, -2.56494936, -3.25809654, -2.56494936,
-2.56494936, -2.56494936, -2.56494936, -3.25809654, -3.25809654,
-2.15948425, -3.25809654, -3.25809654, -2.56494936, -3.25809654,
-2.56494936, -2.56494936, -3.25809654, -2.56494936, -2.56494936,
-2.56494936, -3.25809654, -2.56494936, -3.25809654, -2.56494936,
-2.56494936, -1.87180218]), array([-3.04452244, -3.04452244, -3.04452244, -2.35137526, -2.35137526,
-3.04452244, -3.04452244, -3.04452244, -2.35137526, -2.35137526,
-3.04452244, -3.04452244, -3.04452244, -2.35137526, -2.35137526,
-2.35137526, -2.35137526, -2.35137526, -3.04452244, -1.94591015,
-3.04452244, -2.35137526, -2.35137526, -3.04452244, -1.94591015,
-3.04452244, -1.65822808, -3.04452244, -2.35137526, -3.04452244,
-3.04452244, -3.04452244]), 0.5)
>>>
>>> testEntry = ['love', 'my', 'dalmation']
>>> thisDoc = array(bayes.setOfWords2Vec(myVocalList, testEntry)) #测试数据转词向量
>>> thisDoc
array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
>>> print testEntry,'classified as: ',bayes.classifyNB(thisDoc,p0v,p1v,pab)#判断测试数据类别
['love', 'my', 'dalmation'] classified as: 0
*************************************************************
二、示例:朴树贝叶斯过滤垃圾邮件
email文件夹下有两个文件夹ham和spam,分别存放垃圾邮件和非垃圾邮件,将这50条数据,40条作为训练样本,10条数据作为测试样本,使用词袋模型完成训练和测试,并打印错误词,计算错误率
>>> import bayes
>>> bayes.spamTest()
classification error ['benoit', 'mandelbrot', '', '', 'benoit', 'mandelbrot', '', '', 'wilmott', 'team', 'benoit', 'mandelbrot', 'the', 'mathematician', 'the', 'father', 'fractal', 'mathematics', 'and', 'advocate', 'more', 'sophisticated', 'modelling', 'quantitative', 'finance', 'died', '14th', 'october', '', 'aged', 'wilmott', 'magazine', 'has', 'often', 'featured', 'mandelbrot', 'his', 'ideas', 'and', 'the', 'work', 'others', 'inspired', 'his', 'fundamental', 'insights', 'you', 'must', 'logged', 'view', 'these', 'articles', 'from', 'past', 'issues', 'wilmott', 'magazine']
classification error ['yeah', 'ready', 'may', 'not', 'here', 'because', 'jar', 'jar', 'has', 'plane', 'tickets', 'germany', 'for']
classification error ['home', 'based', 'business', 'opportunity', 'knocking', 'your', 'door', 'don', 'rude', 'and', 'let', 'this', 'chance', 'you', 'can', 'earn', 'great', 'income', 'and', 'find', 'your', 'financial', 'life', 'transformed', 'learn', 'more', 'here', 'your', 'success', 'work', 'from', 'home', 'finder', 'experts']
the error rate is: 0.3
>>>
另一个例子:使用朴素贝叶斯来发现低于相关的用词
原理:利用训练样本求得p0Vect——[2],p1Vect——[1],pAbusive;即P(w|ci)和P(ci),通过调整移除的高频词数据,达到较高的准确率,然后返回出现概率较大的词汇。
(代码略)
详细见书P70
推荐公众号,另一篇比较好的文章【朴素贝叶斯分类算法原理与实践】
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)的更多相关文章
- 学习笔记之机器学习实战 (Machine Learning in Action)
机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中 ...
- K近邻 Python实现 机器学习实战(Machine Learning in Action)
算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...
- 机器学习实战 [Machine learning in action]
内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...
- Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记
Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...
- 【python与机器学习实战】感知机和支持向量机学习笔记(一)
对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...
- Machine Learning(Andrew Ng)学习笔记
1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...
- Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)
我们如今開始训练模型,还输入參数例如以下: rank:ALS中因子的个数.通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间. iterations:迭代次数,每次迭代都会降 ...
- Machine Learning With Spark学习笔记(提取10万电影数据特征)
注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...
- 【Python机器学习实战】感知机和支持向量机学习笔记(三)之SVM的实现
前面已经对感知机和SVM进行了简要的概述,本节是SVM算法的实现过程用于辅助理解SVM算法的具体内容,然后借助sklearn对SVM工具包进行实现. SVM算法的核心是SMO算法的实现,首先对SMO算 ...
随机推荐
- Metasploit中数据库的密码查看以及使用pgadmin远程连接数据库
我们都知道,在msf下进行渗透测试工作的时候,可以将结果数据保存到数据库中,方便各个小组成员在渗透测试过程中的数据同步. 例如,Metasploit提供了db_nmap命令,它能够将Nmap扫描结果直 ...
- qtcreator_process_stub中文输出乱码
使用qt运行程序输出中文,全都变成了□,让人很头疼,百度了很久,找了一些解决方案都是: 用vim打开x11-common,在控制台输入 vim /etc/X11/Xresources/x11-comm ...
- 整理几个 RPC 框架
gRPChttp://www.grpc.io/https://github.com/grpcMotan支撑微博千亿调用的轻量级RPC框架:Motanhttp://h2ex.com/820WangleW ...
- vuex详细介绍和使用方法
1.什么是vuex? 官方的解释: Vuex是一个专为Vue.js应用程序开发的状态管理模式 当项目比较庞大的时候,每个组件的状态比较多,为了方便管理,需要把组件中的状态抽取出来,放入Vuex中进行统 ...
- Sublime Text shift+ctrl 妙用
1 :按住shift+ctrl然后按←或→可快速选中一行中的某一部分,相当于双击鼠标选中. 当你想在代码末尾加注释的话,这个方法很好用 输入文字 -> 光标移到文字末尾 -> 按住shif ...
- 代理模式——java设计模式
代理模式(Proxy Pattern) GoF中给出的代理模式的定义为: 代理模式给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 代理模式的英文叫做Proxy或Surrogate ...
- Andrew Ng机器学习课程笔记(三)之正则化
Andrew Ng机器学习课程笔记(三)之正则化 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365475.html 前言 ...
- 简易的命令行聊天室程序(Winsock,服务器&客户端)
代码中使用WinSock2函数库,设计并实现了简单的聊天室功能.该程序为命令行程序.对于服务器和客户端,需要: 服务器:创建监听套接字,并按本地主机绑定:主线程监听并接受来自客户端的请求,并为该客户端 ...
- Git 管理项目
一个很小的HTML项目,使用.Git来记录和跟踪这个项目.包括以下内容: 创建版本库. 添加与修改文件. 创建新分支. 打标签并整理版本库. 克隆版本库. 创建版本库 Creating a Repos ...
- spring web应用
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...