十大算法之朴素贝叶斯

1.条件概率

这里写图片描述
这个符号代表的意思是在类别Ci的条件下,出现某个由x,y组成的数据点的概率。

2.贝叶斯公式

这里写图片描述
这个准则的目的是求当知道某个点的条件下,判断他属于哪个类别的条件概率。

3.贝叶斯准则进行分类

假设数据点(x,y)可能分成C1,C2类,使用上述的贝叶斯公式进行类别的判断。那么定义贝叶斯准则为:
如果P(C1|x,y)>P(C2|x,y),那么该点属于类别C1
如果P(C1|x,y)

4.朴素贝叶斯

即假设每个样本中的特征出现的可能性相互独立。那么对于多特征的问题计算条件概率的时候,可以利用以下公式来计算条件概率:
P(x,y,z|C1)=P(x|C1)* P(y|C1) * P(z|C1)

5.下面通过以下词向量分类的例子说明朴素配叶斯分类的原理

十大算法之朴素贝叶斯_第1张图片
这里w代表一个词向量,这个词向量有多个特征(w0,w1,w2,…wn),ci是这个词向量的分类。这里假设所有的特征词汇都是独立的,那么在计算p(w0,w1,w2…wn|ci)就可以用p(w0|ci) * p(w1|ci)…p(wn|ci)来代替,这就是朴素贝叶斯的原理。
测试词条转化成向量:
转化出来的向量每个元素代表词汇表中的单词是否出现在该词条中,若出现,则对应元素为1,否则,对应元素为0

def setOfWords2Vec(vocabList,inputSet):
    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

训练贝叶斯分类器:
这里注意了,每个词汇表都相当于一个贝叶斯模型,不同的词汇表会输入不同的trainMatrix,trainCategory参数,从而在训练的结果会出现不同的p0Vect,p1Vect,pAbusive。

#train
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/float(numTrainDocs)#计算出该文档中出现侮辱性词汇的先验概率
    p0Num=ones(numWords)
    p1Num=ones(numWords)
    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)
    p0Vect=log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive

测试分类器:
在classifyNB()函数中,以p(ci,w)代替p(ci|w)来最终判断w的类别,可能是因为在这个分词的背景下,这两个概率是等价的(这个仅仅是我个人的理解)

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
##以下加号的左边是将所有的log相加,就是将所有出现在测试词条的属性的条件概率相乘,最后得出总体的条件概率,右边是类别取对数
    p1=sum(vec2Classify*p1Vec)+log(pClass1)
    p0=sum(vec2Classify*p0Vec)+log(1-pClass1)
    if p1 > p0:
        return 1
    else:
        return 0
#这里太简单,不做解释
def testingNB():
    lsitOPosts,listClasses=loadDataSet()
    myVocabList=createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts: 
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
    p0V,p1V,pAb=trainNB0(trainMat,listClasses)
    testEntry=['love','my','dalmation']
    thisDoc=setOfWords2Vec(myVocabList,testEntry)
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry=['stupid','garbage']
    thisDoc=setOfWords2Vec(myVocabList,testEntry)
    print testEntry,'Classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

6.交叉验证

就是将一个数据集一部分作为训练集,一部分作为测试集合。训练集和测试集不能有交集。

7.以上的一些注释都是对《机器学习实践》一书中第4章贝叶斯算法的一些比较难懂的地方的一下个人理解。

你可能感兴趣的:(十大算法)