主要内容:
·使用概率分布进行分类
·学习朴素贝叶斯分类器
·解析RSS源数据
·使用朴素贝叶斯来分析不同地区的态度
概率论是机器学习算法的基础,所以深刻理解概率论这个主题就十分重要。
4.1 基于贝叶斯决策理论的分类方法
朴素贝叶斯
优点:在数据较少的情况下仍然有效,可以处理多类问题。
缺点:对于输入的数据的准备方式较为敏感。
适用数据类型:标称型数据。
我们先来了解一下贝叶斯决策理论。
假设我们现在有一个数据集,它由两类数据组成,数据分布如下图所示。
假设我们图中有两类数据统计参数。
用p1(x,y)表示数据点(x,y)属于类别1(图中圆点表示的类别)的概率,
用p2(x,y)表示数据点(x,y)属于类别2(图中三角形表示类别的)的概率。
- 如果p1(x,y) > p2(x,y),那么类别为1;
- 如果p2(x,y) > p1(x,y),那么类别为2.。
以上也说明了贝叶斯决策理论的核心思想,我们选择具有最高概率的决策。
如果上面这个图中,使用6个参数来表示,你会更加想使用哪种方法类进行分类呢?
如果是kNN算法,计算量就比较大;如果是使用决策树,不会非常成功。
那么最佳的方法其实是使用贝叶斯决策理论。
4.2 条件概率
我们来复习一下本科时候学习的概率论中的条件概率。
假设现在有一个装了7块石头的的罐子,其中3块是白的,4块是黑色的。如果我们从罐子中随机取出一块石头,那么白色石头的可能性是多少?黑色的又是多少?
显然,取得黑色是概率是4/7 ; 取得白色的概率是 3/7 ;
如果我们的石头放在两个桶中,那么上述的概率又该如何计算呢?
我们先设,取得黑色的概率为P(black) , 取得白色的概率为P(white) 。
那么如何计算黑色或者白色取得的概率问题,就是条件概率。
假设计算的是从B桶取到白色石头的概率,此概率可以记为P(white | bucketsB) , 并称之为“在已知石头出自B桶的条件下,取出白色石头的概率”。
此时
P(white | bucketsA) = 2/4 ; P(white | bucketsB) = 1/3 ;
那么条件概率的计算公式就如下:
P(white | bucketsB) = P(white and bucketsB) / P bucketsB)
我们是需要验证折合后公式的合理性,
P(white and bucketsB) = 1/7 这个就是B桶的白色石头除以两个桶的石头数量总和。再次,B桶有3个石头,总石头数是7,那么 公式就是
P(white | bucketsB) = P(white and bucketsB) / P bucketsB) = (1/7)
/(3/7) = 1/3
另外一种计算条件概率的方法称之为贝叶斯准则。公式如下:
P (c|x ) = P (x|c) * p(c) / p(x)
4.3 使用条件概率来分类
假设我们图中有两类数据统计参数。
用p1(x,y)表示数据点(x,y)属于类别1(图中圆点表示的类别)的概率,
用p2(x,y)表示数据点(x,y)属于类别2(图中三角形表示类别的)的概率。
如果p1(x,y) > p2(x,y),那么类别为C1;
如果p2(x,y) > p1(x,y),那么类别为C2.。
上面只是为了简化问题。
使用贝叶斯准则来交换概率中条件与结果:
应用贝叶斯准则得到,如下:
使用这些定义,可以定义贝叶斯分类:
如果 P(c1,x|y)>P(c2|x,y),那么属于类别c1 。
如果 P(c1,x|y)
def loanDataSet():
postingList = [['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']]
classVec = [0,1,0,1,0,1] #1代表侮辱性文字,0代表正常言论
return postingList,classVec
def createVocabList(dataSet):
#创建一个空集
vocabSet = set ([])
for document in dataSet:
#创建两个集合的并集
vocabSet = vocabSet | set (document)
return list(vocabSet)
def setOfWords2Vec(VocabList,inputSet):
#创建一个其中所含元素都为0的向量并与词汇表等长
returnVec = [0]*len(VocabList)
for word in inputSet:
if word in VocabList:
returnVec[VocabList.index(word)] = 1
else:
print "the word:%s is not in my Vocabulary!" % word
return returnVec
分析:
1.第一个函数创建了一些实验样本。其中第一个变量是进行词条切分后的文档集合,第二个变量是一个类别标签的集合。
2.第二个函数会创建一个包含在所有文档中出现的不重复词的列表。set也会返回一个不重复词表。
3.第三个函数的输入参数为词汇表以及某个文档。创建一个其中所含元素都为0的向量并与词汇表等长,
然后函数会创建一个遍历文档中所有单词,如果出现了词汇中的表中的单词,输出向量为1.
来测试代码:
In [6]: import bayes
In [7]: reload(bayes)
Out[7]: <module 'bayes' from 'bayes.py'>
In [8]: listOposts,listClasses = bayes.loadDataSet()
In [10]: myVocabList = bayes.createVocabList(listOposts)
In [11]: myVocabList
Out[11]:
['cute', 'love', 'help',
'garbage', 'quit', 'I', 'problems', 'is', 'park