《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值。

是一种监督算法。

广泛应用于垃圾邮件检测等等。

 1 # _*_coding:utf-8_*_
 2 from numpy import *
 3
 4 # 4-1 词表到向量的转换函数(实验样本)
 5 def loadDataSet():
 6     postingList = [[‘my‘, ‘dog‘, ‘has‘, ‘flea‘, ‘problems‘, ‘help‘, ‘please‘],
 7                    [‘maybe‘, ‘not‘, ‘take‘, ‘him‘, ‘to‘, ‘dog‘, ‘park‘, ‘stupid‘],
 8                    [‘my‘, ‘dalmation‘, ‘is‘, ‘so‘, ‘cute‘, ‘I‘, ‘love‘, ‘him‘],
 9                    [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘],
10                    [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘, ‘to‘, ‘stop‘, ‘him‘],
11                    [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stupid‘]]
12     classVec = [0, 1, 0, 1, 0, 1]  # 1 is abusive, 0 not
13     return postingList, classVec
14
15 # 返回一个dataSet中所有出现过的词条列表
16 def createVocabList(dataSet):
17     vocabSet = set([])
18     for document in dataSet:
19         vocabSet = vocabSet | set(document) #用于求两个集合的并集
20     return list(vocabSet)
21
22 # 输入参数为词汇表(vocabSet)和某个文档(inputSet),返回的是元素和词汇表元素一一对应的向量returnVec
23 # vocabSet中的元素在inputSet中出现过则向量中元素为1,反之为0
24 def setOfWords2Vec(vocabList, inputSet):
25     returnVec = [0] * len(vocabList)    # [1,2,3]*3 结果等于[1,2,3,1,2,3,1,2,3]
26     for word in inputSet:
27         if word in vocabList:
28             returnVec[vocabList.index(word)] = 1
29         else:
30             print ("the word: %s is not in my Vocabulary!" % word)    # 为什么有这一步?
31     return returnVec
32
33 # 4-2 朴素贝叶斯分类器训练函数
34 # 注意:
35 # trainMatrix不是最原始的文档,而是由原始文档列表得到的矩阵,
36 # 矩阵的列分别对应了所有出现过的词,行对应了各个不同的句子
37 # 上面函数的输出returnVec就是trainMatrix其中的一行
38 # trainCategory为该行是否为侮辱性言论。1为是
39 def trainNB0(trainMatrix, trainCategory):   #
40     numTrainDocs = len(trainMatrix) # 有几句话
41     numWords = len(trainMatrix[0])  # 每句话有几个词条
42     pAbusive = sum(trainCategory)/float(numTrainDocs)   # trainCategory中元素为1的表示是侮辱性语言
43     p0Num = zeros(numWords)+0.00000001 # 累计所有非侮辱性言论中,各个词条出现过的次数
44     p1Num = zeros(numWords)+0.00000001 # 累计所有侮辱性言论中,各个词条出现过的次数 加一个极小量是为了避免在侮辱性言论的条件下,某个词条
45                                        # 的概率为0的情况,此时,最终结果也会为0,显然不对。
46     # p0Denom = 0.0   # 书上代码是被我注释掉了,最终是要得到(非)侮辱性言论中所有出现过的词汇的总和(包括重复值),
47     # p1Demon = 0.0   # 不如在最后将(非)侮辱性言论中每个词汇出现过的次数相加。
48     for i in range(numTrainDocs):
49         if trainCategory[i] == 1:
50             p1Num += trainMatrix[i]
51             # p1Demon += sum(trainMatrix[i])
52         else:
53             p0Num += trainMatrix[i]
54             # p0Denom += sum(trainMatrix[i])
55     p1Demon=sum(p1Num)
56     p0Denom=sum(p0Num)
57     # p1Vect = p1Num/p1Demon
58     # p0Vect = p0Num/p0Denom
59     p1Vect = log(p1Num / p1Demon)   # 利用log()函数避免多个概率连乘过小的问题
60     p0Vect = log(p0Num / p0Denom)
61     return p0Vect, p1Vect, pAbusive
62
63 # 4-3 朴素贝叶斯分类函数
64 # 对于一个测试点,p(ci)几乎不变,p(w|ci)=p(w0|ci)*p(w1|ci)...p(wn|ci)
65 # 而p(w0|ci)的概率又等于pow( ci发生的条件下,下标为0的特征=1的概率, w0发生的次数)
66
67 def classifyNB(vec2Classify, p0Vec,p1Vec, pClass1):
68     p1 = sum(vec2Classify * p1Vec) + log(pClass1)
69     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
70     if p1 > p0:
71         return 1
72     else:
73         return 0
74
75 def testingNB():
76     listOPosts,listClasses = loadDataSet()
77     myVocabList = createVocabList(listOPosts)
78     trainMat = []
79     for postinDoc in listOPosts:
80         trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
81     p0V, p1V, pAb =trainNB0(array(trainMat), array(listClasses))
82     testEntry = [‘love‘, ‘my‘, ‘dalmation‘]
83     thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
84     print (testEntry, ‘classified as:‘, classifyNB(thisDoc, p0V, p1V, pAb))
85     testEntry = [‘stupid‘,‘garbage‘]
86     thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
87     print (testEntry,‘classified as:‘,classifyNB(thisDoc,p0V,p1V,pAb))
时间: 2025-01-14 09:58:03

《机器学习实战》笔记——朴素贝叶斯的相关文章

机器学习实战笔记--朴素贝叶斯

1 #encoding:utf-8 2 from numpy import * 3 import feedparser 4 5 #加载数据集 6 def loadDataSet(): 7 postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], 8 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], 9 ['my', 'dalma

4.机器学习实战之朴素贝叶斯

返回目录 上一篇:决策树 1. 简单理论介绍 1.1  贝叶斯定理 了解贝叶斯定理之前,需要先了解下条件概率.P(A|B)表示在事件B已经发生的条件下事件A发生的概率: P(A|B)=P(AB)  P(B)daf afdfd 假如我们已经知道了P(A|B),但是现在我们想要求P(B|A),也就是在事件A发生的条件下事件B发生的概率,这时贝叶斯定理就派上用场了. P(B|A)=P(A|B)P(B)  P(A)daf afdfd 1.2  朴素贝叶斯分类原理 朴素贝叶斯分类是以贝叶斯定理为基础的,之

机器学习算法:朴素贝叶斯

朴素贝叶斯(Naive Bayesian)算法的核心思想是:分别计算给定样本属于每个分类的概率,然后挑选概率最高的作为猜测结果. 假定样本有2个特征x和y,则其属于分类1的概率记作p(C1|x,y),它的值无法直接分析训练样本得出,需要利用公式间接求得. 其中p(Ci)表示训练样本中分类为Ci的概率,它等于Ci样本数除以样本总数. p(x,y)表示满足2个特征的样本概率,它等于第1特征等于x且第2特征等于y的样本数除以样本总数.可以发现p(x,y)与当前在计算哪个分类概率是无关的,因此实际计算中

机器学习之路--朴素贝叶斯

一,引言 前两章的KNN分类算法和决策树分类算法最终都是预测出实例的确定的分类结果,但是,有时候分类器会产生错误结果:本章要学的朴素贝叶斯分类算法则是给出一个最优的猜测结果,同时给出猜测的概率估计值. 1 准备知识:条件概率公式 相信学过概率论的同学对于概率论绝对不会陌生,如果一时觉得生疏,可以查阅相关资料,在这里主要是想贴出条件概率的计算公式: P(A|B)=P(A,B)/P(B)=P(B|A)*P(A)/P(B) 2 如何使用条件概率进行分类 假设这里要被分类的类别有两类,类c1和类c2,那

吴裕雄--天生自然python机器学习:使用朴素贝叶斯过滤垃圾邮件

使用朴素贝叶斯解决一些现实生活中 的问题时,需要先从文本内容得到字符串列表,然后生成词向量. 准备数据:切分文本 测试算法:使用朴素贝叶斯进行交叉验证 文件解析及完整的垃圾邮件测试函数 def createVocabList(dataSet): vocabSet = set([]) #create empty set for document in dataSet: vocabSet = vocabSet | set(document) #union of the two sets return

【机器学习模型】朴素贝叶斯

一.啥是贝叶斯公式 1.公式定义: 贝叶斯公式是由英国数学家贝叶斯发展,用来描述两个条件概率之间的关系,比如P(A|B)和P(B|A). 按照乘法法则,可以立刻导出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B).如上公式也可变形为:P(B|A) = P(A|B)*P(B) / P(A),即为贝叶斯公式 假设B是由相互独立的事件组成的概率空间{B1,b2,...bn}.则P(A)可以用全概率公式展开:P(A)=P (A|B1)P(B1)+P(A|B2)P(B2)+..P(A|B

Spark机器学习(4):朴素贝叶斯算法

1. 贝叶斯定理 条件概率公式: 这个公式非常简单,就是计算在B发生的情况下,A发生的概率.但是很多时候,我们很容易知道P(A|B),需要计算的是P(B|A),这时就要用到贝叶斯定理: 2. 朴素贝叶斯分类 朴素贝叶斯分类的推导过程就不详述了,其流程可以简单的用一张图来表示: 举个简单的例子来说,下面这张表说明了各地区的人口构成: 这个时候如果一个黑皮肤的人走过来(一个待分类项(0,0,1)),他是来自欧美,亚洲还是非洲呢?可以根据朴素贝叶斯分类进行计算: 欧美=0.30×0.90×0.20×0

机器学习—朴素贝叶斯

机器学习-朴素贝叶斯 本文代码均来自<机器学习实战> 朴素贝叶斯的两个基本假设: 独立:一个特征出现的可能性和与它和其他特征相邻没有关系 每个特征同等重要 这段代码是以文本分类为例介绍朴素贝叶斯算法的 要从文本中获取特征,需要先拆分文本.这里的特征是来自文本的词条(token),一个词条是字符的任意组合.可以把词条想象为单词,也可以使用非单词词条,如URL.IP地址或者任意其他字符串.然后将一个文本片段表示为一个词向量,其中值为1表示词条出现,0表示词条未出现. ??以在线社区的留言板为例,为

《机器学习实战》学习笔记:基于朴素贝叶斯的分类方法

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 目录: 一.基于贝叶斯理论的分类方法 二.关于朴素贝叶斯的应用场景 三.基于Python和朴素贝叶斯的文本分类 1.准备数据 2.训练算法 3.测试算法 四.小结 以下进入正文: 一.基于贝叶斯理论的分类方法 假设有两类数据组成的数据集如下: 其中,假设两个概率分布的参数已知,并用p1(x,y)表示当前数据点(x,y)属于类