使 用 朴 素 贝 叶 斯 进 行 文 档 分 类

本文介绍了朴素贝叶斯分类法的基本原理,包括先验概率和条件概率的学习过程,以及如何利用训练数据集进行参数估计。同时展示了算法的具体实现流程,如数据集处理、数据去重、文档向量化及训练和分类函数的设计。此外,还探讨了贝叶斯网络的概念及其在概率推理中的应用。

朴素贝叶斯分类法,主要是通过训练学习联合概率分布。具体是学习先验概率和条件概率。 朴素贝叶斯法将实例分到后验概率最大分类中,实际上等价于期望风险最小化
朴素贝叶斯的参数估计有两种方式,一种是极大似然估计,另外一种是使用贝叶斯估计

数据集处理函数 词 表 到 向 暈 的 转 换 函 数

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]    #1 为侮辱,0 位不侮辱
        return postingList,classVec

数据去重函数 将重复数据去除

def creatVocabList(dataSet):
    Set=set([])#创建一个空表
    for file in dataSet:
        Set =Set | set(file) #合并两个表
    return list(Set)

遍 历 文 档 中 的 所有 单 词 , 如果 出 现 了 词 汇 表 中 的 单 词 , 则 将 输 出 的 文 档 向 量 中 的 对 应值 设 为 1 每 当 遇 到 一 个 单 词 时 , 它 会 增 加 词 向 量 中 的 对 应值 , 而 不 只 是 将 对 应的数 值 设 为 1

def setofWord(vocablist,inputSet):
    returnVec=[0]*len(vocablist)
    for word in inputSet:
        if word in vocablist:
                returnVec[vocablist.index(word)]+=1
    return returnVec
训练函数  trainMatrix训练数据  trainlib 训练数据类别
def trainbayes(trainMatrix,trainlib):
    numTrainDocs = len(trainMatrix)  # 数据集的长度
    numWords = len(trainMatrix[0])
    PaA= sum(trainlib)/float(numTrainDocs)
    p0num=ones(numWords);p1num=ones(numWords)
    p0Denom=2.0;p1Denom=2.0
    for i in range(numTrainDocs):  # 遍历所有的数据集
        if trainlib[i] == 1:
            p1num +=trainMatrix[i]  #出现侮辱性词语 ,个数加1
            p1Denom += sum(trainMatrix[i])  # 总词数加1
        else:
            p0num +=trainMatrix[i]  # 对于没有侮辱词语 个数加一
            p0Denom += sum(trainMatrix[i])
    p1v = log(p1num/p1Denom) # 计侮辱性词语出现的概率
    p0v = log(p0num/p0Denom)
    return p0v,p1v,PaA

分类函数 如果 概率p1 >p2 就是侮辱性词语

def classifyB(needclassify,p0v,p1v,pclass):
    p1=sum(needclassify * p1v) + log(pclass)
    p0 = sum(needclassify * p0v) + log(1.0-pclass)
    if p1> p0:
        return 1  # 1 位侮辱性词汇
    else:
        return 0  # 0 不是侮辱性词汇

测试贝叶斯函数

def testingB():
    listOPosts,listClasses = loadDataSet()  # 初始化数据集
    myVocabList = creatVocabList(listOPosts)  #数据去重
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setofWord(myVocabList, postinDoc))  #判断单词在数据集中是出现
    p0V,p1V,pAb =trainbayes(array(trainMat),array(listClasses))  # 获取概率
    testEntry = ['love', 'my', 'dalmation']
    thisDoc = array(setofWord(myVocabList, testEntry))
    print testEntry,u'分类为: ',classifyB(thisDoc,p0V,p1V,pAb)
    testEntry = ['stupid', 'garbage']
    thisDoc = array(setofWord(myVocabList, testEntry))
    print testEntry,u'分类为: ',classifyB(thisDoc,p0V,p1V,pAb)

文本进行处理函数 该 函 数 去 掉 少 于 两 个 字 符 的 字 符 串 , 并 将 所 有 字 符 串 转 换 为 小 写

def textParse(bigString):
    listOfTokens = re.split(r'\W*', bigString)  #使用正则处理文件
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] # 将字符字符转为小写。

使 用 朴 素 贝 叶 斯 过 滤 垃 圾 邮 件

def spamTest():
    docList=[]; classList = []; fullText =[]   #文件列表  分类列表  文件
    #  导入并解析文本
    for i in range(1,26):
        wordList = textParse(open('email/spam/%d.txt' % i).read())  #打开文件
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = creatVocabList(docList)
    trainingSet = range(50); testSet=[]            #创建一个训练数组
    for i in range(10):   #  选取十个邮件作为测试集
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat=[]; trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(setofWord(vocabList, docList[docIndex]))  # 构建词向量
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainbayes(array(trainMat),array(trainClasses))
    errorCount = 0
    for docIndex in testSet:        #对邮件进行分类
        wordVector = setofWord(vocabList, docList[docIndex])
        if classifyB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount += 1
            print u"分类错误",docList[docIndex]
    print u'错误率: ',float(errorCount)/len(testSet)

朴素贝叶斯算法主要是基于一个贝叶斯假设 所有的数据都相互独立但是这在现实中是不可能的。但是使用贝叶斯进行推理效果是很好的,一般来说,使用贝叶斯网的效果会更好。
贝叶斯网络是一种概率网络,它是基于概率推理的图形化网络,而贝叶斯公式则是这个概率网络的基础。贝叶斯网络是基于概率推理的数学模型,所谓概率推理就是通过一些变量的信息来获取其他的概率信息的过程,基于概率推理的贝叶斯网络是为了解决不定性和不完整性问题而提出的,它对于解决复杂设备不确定性和关联性引起的故障有很大的优势。
一个完整的贝叶斯网络的构成包括网络的构建和网络的训练,一般来说,网络的构建是一个很复制的事情。贝叶斯网络的训练和隐马尔可夫模型类似但是相比马尔可夫链,贝叶斯网络更加复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值