机器学习实战——朴素贝叶斯练习

参考:https://www.cnblogs.com/zy230530/p/6847243.html
代码段需完善

假设这里要被分类的类别有两类,类c1和类c2,那么我们需要计算概率p(c1|x,y)和p(c2|x,y)的大小并进行比较:

如果:p(c1|x,y)>p(c2|x,y),则(x,y)属于类c1

     p(c1|x,y)<p(c2|x,y),则(x,y)属于类c2

我们知道p(x,y|c)的条件概率所表示的含义为:已知类别c1条件下,取到点(x,y)的概率;那么p(c1|x,y)所要表达的含义呢?显然,我们同样可以按照条件概率的方法来对概率含义进行描述,即在给定点(x,y)的条件下,求该点属于类c1的概率值。那么这样的概率该如何计算呢?显然,我们可以利用贝叶斯准则来进行变换计算:
  p(ci|x,y)=p(x,y|ci)*p(ci)/p(x,y)

利用上面的公式,我们可以计算出在给定实例点的情况下,分类计算其属于各个类别的概率,然后比较概率值,选择具有最大概率的那么类作为点(x,y)的预测分类结果。

以上我们知道了通过贝叶斯准则来计算属于各个分类的概率值,那么具体而言,就是计算贝叶斯公式中的三个概率,只要得到了这三个概率值,显然我们就能通过贝叶斯算法预测分类的结果了。因此,到了这里,我们就知道了朴树贝叶斯算法的核心所在了。

#-*- coding: UTF-8 -*-
from math import log
import operator
from numpy import *
'''
函数说明:创建实验样本

return:
    postingList--实验样本切分的词条
    classVec--类标签向量

date:
    2018-8-25

'''

def loadDataSet():
        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]                                                                   #类标签向量

        return postingList,classVec



'''
将实验样本词条整理成不重复的词条列表,即词汇表
dataSet--实验样本
vocabSet--返回不重复的词条列表
'''

def creatVocabList(dataSet):
    vocabSet = set([])                                                      #创建一个空的集合
    for document in dataSet:
        vocabSet = vocabSet | set(document)                                 #将dataSet中产生的新词集合到vocabSet中
    return list(vocabSet)


'''
根据vocabList词汇表,将inputSet向量化,向量的元素为1或0
vocabList--creatVocabList返回的列表
inputSet--输入文档
0/1表示vocabList中是否出现inpoutSet的文档

'''
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 !" % word)
    return returnVec


'''
Bayes分类器训练函数
trainMatrix--训练文档矩阵,即setOfWord2Vec函数返回的矩阵
trainCategory--训练类别标签向量,即loadDataSet返回的classVec
'''

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                                         #获取训练矩阵中文档的数目
    numWords = len(trainMatrix[0])                                          #j计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)                       #计算文档中属于1类的概率
    p0Num = ones(numWords);p1Num=ones(numWords)                           #每篇文档词条出现次数初始化为1(避免朴素贝叶斯中出现某项为0的情况)
    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


'''
朴素贝叶斯分类函数
    vec2Classify--待分类的词条向量
    p0Vect
    p1Vect
    pAbusive

'''
def classfyNB(vec2Classify,p0Vect,p1Vect,pAbusive):
    p1 = sum(vec2Classify * p1Vect) + log(pAbusive)
    p0 = sum(vec2Classify * p0Vect) + log(1-pAbusive)
    if p1 > p0:
        return 1
    else:
        return 0

'''
测试函数
'''
def testingNB():
    postingList, classVec = loadDataSet()                                                   #创建样本
    vocabList = creatVocabList(postingList)                                                 #创建词汇表
    trainMatrix = []
    for postinDoc in postingList:
        trainMatrix.append(setOfWords2Vec(vocabList,postinDoc))                             #向量化实验样本

    p0Vect, p1Vect, pAbusive = trainNB0(np.array(trainMatrix),np.array(classVec))           #训练样本分类器

    vec2Classify = ['love']                                                                #测试样本
    thisDoc = np.array(setOfWords2Vec(vocabList,vec2Classify))                              #测试样本转化为向量形式
    if classfyNB(thisDoc,p0Vect,p1Vect,pAbusive):                                           #利用分类器分类
        print(vec2Classify,"属于侮辱类")

    else:
        print(vec2Classify,"不属于侮辱类")



import numpy as np

if __name__ == '__main__':
    # postingList,classVec = loadDataSet()                                #注释部分多为代码编写过程中测试输出部分  
    # # for each in postingList:
    # #     print(each)
    # # print(classVec)
    #
    # vocabList = creatVocabList(postingList)
    # # print(vocabList)
    # # print(postingList[0])
    # # print(vocabList)
    # # returnvec = setOfWords2Vec(vocabList,postingList[0])
    # # print(returnvec)
    # trainMatrix = []
    # for postinDoc in postingList:
    #     trainMatrix.append(setOfWords2Vec(vocabList,postinDoc))
    # p0Vect,p1Vect,pAbusive=trainNB0(trainMatrix,classVec)
    # print('p0Vect:\n', p0Vect)
    # print('p1Vect:\n', p1Vect)
    # print('classVec:\n', classVec)
    # print('pAbusive:\n', pAbusive)
    #
    # # print(trainMatrix[0])
    # # print(sum(trainMatrix[0]))
    # # print(vocabList)
    # # print(len(vocabList))
    # # print(trainMatrix)
    # # print(len(trainMatrix[0]))
    #
    # # print('postinDoc:\n',postinDoc)
    # # print('postingList:\n',postingList)
    # # print('vocabList:\n',vocabList)
    # # print('trainMat:\n',trainMatrix)

    testingNB()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值