朴素贝叶斯算法

这篇具有很好参考价值的文章主要介绍了朴素贝叶斯算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

朴素贝叶斯公式来历

 

NaïveBayes算法,又叫朴素贝叶斯算法。
  朴素:特征条件独立;
  贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。
  朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独立假设的分类方法,它 通过特征计算分类的概率,选取概率大的情况,是基于概率论的一种机器学习分类(监督学习)方法,被广泛应用于情感分类领域的分类器。
朴素贝叶斯算法是应用最为广泛的分类算法之一,在垃圾邮件分类等场景展露出了非常优秀的性能。
在介绍朴素贝叶斯公式前,先介绍一下条件概率公式。条件概率表示在B已经发生的条件下,A发生概率。
朴素贝叶斯算法

朴素贝叶斯公式就是条件概率的变形。
假设已有数据为
朴素贝叶斯算法
其中x为属性值,y为分类结果,共有n个已有数据。每个x有多种属性,以第一组数据为例,上标表示第几个属性值,x的具体表示如下
朴素贝叶斯算法 
假设y的可取值为(c1,c2,…,ck)
则贝叶斯公式表示为
朴素贝叶斯算法
由公式可以看出,贝叶斯公式就是条件概率的公式。贝叶斯公式的解释很简单:在已有数据的基础上,出现了一个新数据,只有X=(a1,a2,…,am),来预测y的取值。贝叶斯公式就是求在目前X发生的情况下,y取不同值的概率大小进行排序,取最大概率的y值。
其中X有多个属性,朴素贝叶斯假设各个属性之间是独立的,因此
朴素贝叶斯算法
因此朴素贝叶斯公式可以写成
朴素贝叶斯算法
此公式的含义就是在目前已知历史数据数据的前提下,出现了一个新的X,求在X已经发生的条件下,y取不同值的概率,然后取使得条件概率最大的y作为预测结果。也就是说寻找y的取值Cn,使得上式最大。

举例:在夏季,某公园男性穿凉鞋的概率为 1/2 ,女性穿凉鞋的概率为 2/3 ,并且该公园中男女比例通常为 2:1 ,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?

分析:
在例子中,根据男女比例2:1,可得 P(Y=ymen)=2/3,P(Y=ywomen)=1/3
在例子中:男性穿凉鞋的概率为 1/2,也就是说“是男性的前提下,穿凉鞋的概率是 1/2,此概率为条件概率,即 P(X=x1|Y=ymen)=1/2。同理“女性穿凉鞋的概率为 2/3” 为条件概率 P(X=x1|Y=ywomen)=2/3。
则P(X=x1)=(1/2*2+2/3*1)/3=5/9
则可得
朴素贝叶斯算法

 同理
朴素贝叶斯算法

 则为男性的概率为3/5 为女性的概率为2/5.

垃圾邮件分类实现

步骤:

收集数据:提供文本文件。
准备数据:将文本文件解析成词条向量。
分析数据:检查词条确保解析的正确性。
训练算法:计算不同的独立特征的条件概率。
测试算法:计算错误率。
使用算法:构建一个完整的程序对一组文档进行分类

训练集的准备与处理

准备两个文件夹分别存入垃圾邮件及正常邮件两种邮件当作训练集。

朴素贝叶斯算法朴素贝叶斯算法

 准备数据:从文本中构建词向量

def loadDataSet():
    postingList=[['my','dog','has','flea','problems','help','please'],
                 ['maybe','not','take','him','to','dog','park','stupid'],
                 ['my','dalmatian','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代表正常言论(对应6个文档)
    return postingList,classVec

def createVocabList(dataSet):
    vocabSet=set()
    for document in dataSet:
        vocabSet=vocabSet|set(document)   #两个集合的并集
    return list(vocabSet)

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

训练算法:从词向量计算概率

import numpy as np
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)   
    numWords=len(trainMatrix[0])   
    pABusive=sum(trainCategory)/float(numTrainDocs) 
    # p0Num=np.zeros(numWords)
    # p1Num=np.zeros(numWords)
    # p0Denom=0.0
    # p1Denom=0.0
    p0Num=np.ones(numWords)
    p1Num=np.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=p1Num/p1Denom
    # p0Vect=p0Num/p0Denom
    p1Vect=np.log(p1Num/p1Denom)
    p0Vect=np.log(p0Num/p0Denom)

    return  p0Vect,p1Vect,pABusive

 贝叶斯分类函数

#贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1=sum(vec2Classify*p1Vec)+np.log(pClass1)
    p0=sum(vec2Classify*p0Vec)+np.log(1-pClass1)
    if p1>p0:
        return 1
    else:
        return 0
def NBtesting():
    listOPosts,listClasses=loadDataSet()
    myVocabList=createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
    p0V,p1V,pAb=trainNB0(np.array(trainMat),np.array(listClasses))
    testEntry=['love','my','dalmation']
    thidDoc=np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as:',classifyNB(thidDoc,p0V,p1V,pAb))
    testEntry=['stupid','garbage']
    thisDoc=np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))

文档词袋模型 

#朴素贝叶斯词袋模型
def bagOfWords2Vec(vocabList,inputSet):
    returnVec=[0*len(vocabList)]
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]+=1
    return returnVec

切分文本 

mySent='This book is the best book on python or M.L. I have ever laid eyes upon.'
print(mySent.split())
import re
mySent='This book is the best book on python or M.L. I have ever laid eyes upon.'
regEX=re.compile('\\W+')
listOfTokens=regEX.split(mySent)
print(listOfTokens)
import re
mySent='This book is the best book on python or M.L. I have ever laid eyes upon.'
regEX=re.compile('\\W+')
listOfTokens=regEX.split(mySent)
print([tok for tok in listOfTokens if len(tok)>0])
print([tok.lower() for tok in listOfTokens if len(tok)>0])

使用朴素贝叶斯进行交叉验证

def textParse(bigString):  
    import re
    listOfTokens = re.split(r'\W*', bigString)  
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] 
import random
def spamTest():
    docList = []
    classList = []
    fullText = []
    for i in range(1, 26):  # 遍历25个txt文件
        wordList = textParse(open('C:/Users/Administrator/Desktop/email/spam/%d.txt' % i).read())  # 读取每个垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)  # 标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('C:/Users/Administrator/Desktop/email/ham/%d.txt' % i).read())  # 读取每个非垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)  # 标记正常邮件,0表示正常文件
    vocabList = createVocabList(docList)  # 创建词汇表,不重复
    trainingSet = list(range(50))
    testSet = []  # 创建存储训练集的索引值的列表和测试集的索引值的列表
    for i in range(10):  # 从50个邮件中,随机挑选出40个作为训练集,10个做测试集
        randIndex = int(random.uniform(0, len(trainingSet)))  # 随机选取索索引值
        testSet.append(trainingSet[randIndex])  # 添加测试集的索引值
        del (trainingSet[randIndex])  # 在训练集列表中删除添加到测试集的索引值
    trainMat = []
    trainClasses = []  # 创建训练集矩阵和训练集类别标签系向量
    for docIndex in trainingSet:  # 遍历训练集
        trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))  # 将生成的词集模型添加到训练矩阵中
        trainClasses.append(classList[docIndex])  # 将类别添加到训练集类别标签系向量中
    p0V, p1V, pSpam = trainNB0(np.array(trainMat), np.array(trainClasses))  # 训练朴素贝叶斯模型
    errorCount = 0  # 错误分类计数
    for docIndex in testSet:  # 遍历测试集
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])  # 测试集的词集模型
        if classifyNB(np.array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:  # 如果分类错误
            errorCount += 1  # 错误计数加1
            # print("分类错误的测试集:",docList[docIndex])
    print('错误率:%.2f%%' % (float(errorCount) / len(testSet) * 100))
spamTest()

测试结果: (随机获取10个训练集里的文本当做测试集)

朴素贝叶斯算法
朴素贝叶斯算法 
朴素贝叶斯算法 

由结果可知错误率平均为0.6 我认为错误率这么大的原因是因为我的训练集样本不够丰富而且训练集样本中很多文档的内容相似,如果有够好的训练集的话训练结果应该会更好。

总结

朴素贝叶斯优缺点:
优点:在数据较少的情况下仍然有效,可以处理多类别问题
缺点:对于输入数据的准备方式较为敏感,由于朴素贝叶斯的“特征条件独立”特点,所以会带来一些准确率上的损失
 

代码参考机器学习实战课本文章来源地址https://www.toymoban.com/news/detail-493766.html

到了这里,关于朴素贝叶斯算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 朴素贝叶斯算法

      NaïveBayes算法,又叫朴素贝叶斯算法。   朴素:特征条件独立;   贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景

    2024年02月09日
    浏览(37)
  • 朴素贝叶斯算法的介绍

    一、朴素贝叶斯算法的介绍 1.什么是朴素贝叶斯算法? 朴素贝叶斯算法(Naive Bayes Algorithm)是一种基于贝叶斯定理和特征独立性假设的概率分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等任务。 朴素贝叶斯算法的 基本思想是基于训练数据中的特征和标签之

    2024年02月07日
    浏览(37)
  • 【朴素贝叶斯算法】

    贝叶斯定理简介 贝叶斯定理是朴素贝叶斯算法的基础,它是一种概率理论,用于计算在给定一些条件下,另一些条件的概率。贝叶斯定理的核心思想是通过已知的信息来更新对未知事件的概率估计。 在贝叶斯定理中,我们用P(A|B)表示在事件B发生的条件下事件A发生的概率。它

    2024年02月15日
    浏览(32)
  • 【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器

    🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能硬件(虽然硬件还没开始玩,但一直

    2024年02月15日
    浏览(56)
  • 无涯教程-分类算法 - 朴素贝叶斯

    朴素贝叶斯算法是一种基于应用贝叶斯定理的分类技术,其中强烈假设所有预测变量彼​​此独立。简而言之,假设是某个类中某个要素的存在独立于同一类中其他任何要素的存在。 在贝叶斯分类中,主要的兴趣是找到后验概率,即给定某些观察到的特征的标签的概率。借助

    2024年02月11日
    浏览(56)
  • 机器学习算法——贝叶斯分类器3(朴素贝叶斯分类器)

    基于贝叶斯公式来估计后验概率P(c|x)的主要困难在于:类条件概率P(x|c)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。 为避开这个障碍,朴素贝叶斯分类器(Naive Bayes classfier)采用了“ 属性条件独立性假设 ”:对已知类别,假设所有属性相互独立。换句话

    2023年04月22日
    浏览(58)
  • 【机器学习】十大算法之一 “朴素贝叶斯”

      作者主页: 爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主 爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域. https://blog.csdn.net/Code_and516?type=blog 个人简介:打工人。 持续分

    2024年02月09日
    浏览(41)
  • 机器学习算法系列(六)-- 朴素贝叶斯

    朴素贝叶斯法是基于概率统计,特征条件独立假设的分类方法,是一种非常常用的机器学习算法;通常用于处理文本分类和情感分析等自然语言处理任务中。相对于其他复杂的模型,朴素贝叶斯算法具有简单、易于实现、高效和良好的准确性等特点。 概率论基础 条件概率 事

    2024年02月07日
    浏览(45)
  • 《机器学习核心算法》分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 朴素贝叶斯法(Naive Bayes model 简称 NBM )是基于 「贝叶斯定理」 与 「特征条件独立假设」 的分类方法。 「贝

    2024年02月08日
    浏览(53)
  • 21- 朴素贝叶斯 (NLP自然语言算法) (算法)

    朴素贝叶斯要点 概率图模型 算法往往应用于 NLP自然语言处理领域 。 根据 文本内容 判定 分类 。  概率密度公式 :   高斯 朴素贝叶斯算法: 伯努利分布 朴素贝叶斯算法 多项式分布 朴素贝叶斯表现 英文one-hot 编码: jieba.lcut (str) 数据去重 :    result = np.unique (result)    

    2023年04月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包