MLA Review之三:朴素贝叶斯分类

2024-05-09 07:58

本文主要是介绍MLA Review之三:朴素贝叶斯分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

朴素贝叶斯(Naive Bayes),贝叶斯概率论在整个统计学习上都是泰山北斗一样的存在,《Pattern Recognization and Machine Learning》这一扛鼎之作全书的思想其实就是贝叶斯概率论,简单的说就是先验代替后验。

 

我们先来给朴素贝叶斯找一点理论支持

 

贝叶斯概率公式:P(A|B)=P(A)*p(B|A)/P(B) ,而根据要求,我们需要做的是得出P(C1|X,Y)和P(C2|X,Y)的概率,其中P(C1|X,Y)的意思是根据特征值X,Y得到是C1的概率,后面是得到C2的概率,因此,我们只需要比较这两者的大小就知道结果是归为哪一类了,但是问题是这个根本不好计算,这时候贝叶斯准则就可以派上用场了:

P(C1|X,Y)=P(C1)*P(X,Y|C1)/P(X,Y)

其中P(X,Y)是可以忽略的,因此P(C1|X,Y)约等于P(C1)*P(X,Y|C1),这个时候我们可以用经验概率来计算P(C1),但是计算P(X,Y|C1)仍然有难度,为了简单起见,朴素贝叶斯假设X,Y是独立的,所谓朴素也就指的是这个独立假设,也就是P(X,Y|C1)=P(X|C1)*P(Y|C1),这样就很容易计算该值了,可以得到:

P(C1|X,Y)=P(C1)*P(X|C1)*P(Y|C1),这样就容易计算了。

 

背景粗略交代完毕,现在回到具体问题:

 

邮件分类器:邮件分类垃圾邮件个正常邮件,根据已有的邮件训练样本,训练出邮件分类模型。

数据说明25封垃圾邮件,25封正常邮件,在这50封邮件里面随机选取10篇作为测试数据,剩下40篇作为训练数据

       算法说明

  • 根据所给的训练邮件,得到所有的不重复单词数组,记为wordlist
  • 将训练数据和测试数据按照wordlist的顺序转换成词向量
  • 根据词向量使用NaiveBayes训练模型
  • 使用测试数据集测试结果

     下面是具体代码:

 

Python代码   收藏代码
  1. # -*- coding: UTF8 -*-  
  2. """ 
  3. author:luchi 
  4. date:16/2/18 
  5. desc: 
  6. 朴素贝叶斯做邮件分类 
  7. """  
  8.   
  9. """ 
  10. 获取训练与测试文本,构建训练集与测试集 
  11. """  
  12. import re  
  13. import random  
  14. from numpy import *  
  15.   
  16.   
  17. def splitWords(str):  
  18.     listTokens=re.split(r'\W*',str)  
  19.     return [token.lower() for token in listTokens  if len(token)>2 ]  
  20.   
  21. def initDataset():  
  22.   
  23.     wordList=[]  
  24.     docList=[]  
  25.     labels=[]  
  26.     for i in range(1,26):  
  27.         fr=open('email/spam/%d.txt' % i)  
  28.         frStr=fr.read()  
  29.         l=splitWords(frStr)  
  30.         docList.append(l)  
  31.         labels.append(0)  
  32.         wordList.extend(l)  
  33.         fr=open('email/ham/%d.txt' % i)  
  34.         frStr=fr.read()  
  35.         l=splitWords(frStr)  
  36.         docList.append(l)  
  37.         labels.append(1)  
  38.         wordList.extend(l)  
  39.     # print wordList  
  40.     # print docList  
  41.     #随机选出10个组作为测试  
  42.     length=len(docList)  
  43.     testList=[]  
  44.     testLabels=[]  
  45.     for i in range(10):  
  46.         randIndex=int(random.uniform(0,len(docList)))  
  47.         testList.append(docList[randIndex])  
  48.         testLabels.append(labels[randIndex])  
  49.         del(docList[randIndex])  
  50.         del(labels[randIndex])  
  51.     return wordList,docList,labels,testList,testLabels,length  
  52.   
  53. """ 
  54.  
  55. 创建训练和测试向量 
  56.  
  57. """  
  58.   
  59. def getVecDataset(wordList,trainList,testList):  
  60.     wordList=set(wordList)  
  61.     wordvec=[token for token in wordList]  
  62.     feature_num=len(wordvec)  
  63.     print len(wordvec)  
  64.     trainVec=zeros((len(trainList),feature_num))  
  65.     testVec=zeros((len(testList),feature_num))  
  66.   
  67.     for i,l in enumerate(trainList):  
  68.         for word in l:  
  69.             if word in wordvec:  
  70.                 trainVec[i][wordvec.index(word)]+=1  
  71.     for i,l in enumerate(testList):  
  72.         for word in l:  
  73.             if word in wordvec:  
  74.                 testVec[i][wordvec.index(word)]+=1  
  75.     return  trainVec,testVec  
  76.   
  77.   
  78.   
  79.   
  80. def NaiveBayes(traingList,trainLabel):  
  81.   
  82.     trainMat=array(traingList)  
  83.     labelMat=array(trainLabel)  
  84.     class0=ones(len(trainMat[0]))  
  85.     sumClass0=2.0  
  86.     class1=ones(len(trainMat[0]))  
  87.     sumClass1=2.0  
  88.     m=len(trainMat)  
  89.     pclass0=0  
  90.   
  91.     for i in range(m):  
  92.         if(trainLabel[i]==0):  
  93.             class0+=trainMat[i]  
  94.             sumClass0+=sum(trainMat[i])  
  95.             pclass0+=1  
  96.         elif trainLabel[i]==1:  
  97.             class1+=trainMat[i]  
  98.             sumClass1+=sum(trainMat[i])  
  99.     # print class0  
  100.     # print sumClass0  
  101.     class0=class0/sumClass0  
  102.     class1=class1/sumClass1  
  103.     class0=log(class0)  
  104.     class1=log(class1)  
  105.     return class0,class1,pclass0  
  106.   
  107. def testNaiveBayes(testVec,vec0,vec1,pclass0):  
  108.     p0=sum(testVec*vec0)+log(pclass0)  
  109.     p1=sum(testVec*vec1)+log(1-pclass0)  
  110.     if(p0>p1):  
  111.         return 0  
  112.     else:  
  113.         return 1  
  114.   
  115.   
  116.   
  117. def test():  
  118.     wordList,trainList,trainLabels,testList,testLabels,doc_num=initDataset()  
  119.     trainVec,testVec=getVecDataset(wordList,trainList,testList)  
  120.     class0Vec,class1Vec,pclass0=NaiveBayes(trainVec,trainLabels)  
  121.     m=len(testVec)  
  122.     err=0  
  123.     pclass0=float(pclass0)/len(trainVec)  
  124.     for i in range(m):  
  125.         vec=testVec[i]  
  126.         label=testLabels[i]  
  127.         result=testNaiveBayes(array(vec),class0Vec,class1Vec,pclass0)  
  128.         if result!=label:  
  129.             err+=1  
  130.     print ("error rate is %f" % (float(err)/m))  
  131.   
  132.   
  133. if __name__=="__main__":  
  134.     test()  

 

注意程序中使用的log方法不是math包里的log方法,而是numpy里面的log方法,所以不要引入math包即可

 

测试的结果是:



 

 

 

 

 

可以看到,在5次测试中,只有一次的错误率为10%,其他全是0

 

朴素贝叶斯在使用起来容易,操作简单,却往往在一些问题上有着惊人的高效,这也是其强大的原因,但是朴素贝叶斯并不是对所有问题都适用,其独立假设就已经表示对一些对特征值有着明显先后或者依赖关系的时候,朴素贝叶斯的独立假设是不成立的,所以使用朴素贝叶斯还是实现需要看下具体的问题

这篇关于MLA Review之三:朴素贝叶斯分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972829

相关文章

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

J.U.C Review - ThreadLocal原理源码分析

文章目录 一致性问题一致性问题简介解决一致性问题的常见方法 ThreadLocal什么是 ThreadLocalThreadLocal 的 线程模型ThreadLocal 的工作原理使用场景ThreadLocal 的基本 API1. 构造函数 `ThreadLocal()`2. 初始化方法 `initialValue()`3. 访问器 `get()` 和 `set()`4. 回收方法 `re