朴素贝叶斯算法的python实现方法


Posted in Python onNovember 18, 2014

本文实例讲述了朴素贝叶斯算法的python实现方法。分享给大家供大家参考。具体实现方法如下:

朴素贝叶斯算法优缺点

优点:在数据较少的情况下依然有效,可以处理多类别问题

缺点:对输入数据的准备方式敏感

适用数据类型:标称型数据

算法思想:

比如我们想判断一个邮件是不是垃圾邮件,那么我们知道的是这个邮件中的词的分布,那么我们还要知道:垃圾邮件中某些词的出现是多少,就可以利用贝叶斯定理得到。

朴素贝叶斯分类器中的一个假设是:每个特征同等重要

函数
loadDataSet()

创建数据集,这里的数据集是已经拆分好的单词组成的句子,表示的是某论坛的用户评论,标签1表示这个是骂人的

createVocabList(dataSet)

找出这些句子中总共有多少单词,以确定我们词向量的大小

setOfWords2Vec(vocabList, inputSet)

将句子根据其中的单词转成向量,这里用的是伯努利模型,即只考虑这个单词是否存在

bagOfWords2VecMN(vocabList, inputSet)

这个是将句子转成向量的另一种模型,多项式模型,考虑某个词的出现次数

trainNB0(trainMatrix,trainCatergory)

计算P(i)和P(w[i]|C[1])和P(w[i]|C[0]),这里有两个技巧,一个是开始的分子分母没有全部初始化为0是为了防止其中一个的概率为0导致整体为0,另一个是后面乘用对数防止因为精度问题结果为0

classifyNB(vec2Classify, p0Vec, p1Vec, pClass1)

根据贝叶斯公式朴素贝叶斯算法的python实现方法计算这个向量属于两个集合中哪个的概率高

#coding=utf-8

from numpy import *

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 is abusive, 0 not

    return postingList,classVec
#创建一个带有所有单词的列表

def createVocabList(dataSet):

    vocabSet = set([])

    for document in dataSet:

        vocabSet = vocabSet | set(document)

    return list(vocabSet)

    

def setOfWords2Vec(vocabList, inputSet):

    retVocabList = [0] * len(vocabList)

    for word in inputSet:

        if word in vocabList:

            retVocabList[vocabList.index(word)] = 1

        else:

            print 'word ',word ,'not in dict'

    return retVocabList
#另一种模型    

def bagOfWords2VecMN(vocabList, inputSet):

    returnVec = [0]*len(vocabList)

    for word in inputSet:

        if word in vocabList:

            returnVec[vocabList.index(word)] += 1

    return returnVec
def trainNB0(trainMatrix,trainCatergory):

    numTrainDoc = len(trainMatrix)

    numWords = len(trainMatrix[0])

    pAbusive = sum(trainCatergory)/float(numTrainDoc)

    #防止多个概率的成绩当中的一个为0

    p0Num = ones(numWords)

    p1Num = ones(numWords)

    p0Denom = 2.0

    p1Denom = 2.0

    for i in range(numTrainDoc):

        if trainCatergory[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

    

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):

    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult

    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)

    if p1 > p0:

        return 1

    else: 

        return 0

        

def testingNB():

    listOPosts,listClasses = loadDataSet()

    myVocabList = createVocabList(listOPosts)

    trainMat=[]

    for postinDoc in listOPosts:

        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))

    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))

    testEntry = ['love', 'my', 'dalmation']

    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))

    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

    testEntry = ['stupid', 'garbage']

    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))

    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

    

    

def main():

    testingNB()

    

if __name__ == '__main__':

    main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python中实现对list做减法操作介绍
Jan 09 Python
Python实现微信公众平台自定义菜单实例
Mar 20 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python中extend和append的区别讲解
Jan 24 Python
Django框架 Pagination分页实现代码实例
Sep 04 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
python爬虫实现获取下一页代码
Mar 13 Python
python实现邮件循环自动发件功能
Sep 11 Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 #Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 #Python
django 自定义用户user模型的三种方法
Nov 18 #Python
使用grappelli为django admin后台添加模板
Nov 18 #Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 #Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 #Python
github配置使用指南
Nov 18 #Python
You might like
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
python直接访问私有属性的简单方法
2016/07/25 Python
详解python 中in 的 用法
2019/12/12 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
销售自我评价
2013/10/22 职场文书
群众路线批评与自我批评
2014/02/06 职场文书
班干部演讲稿
2014/04/24 职场文书
爱与责任演讲稿
2014/05/20 职场文书
学校献爱心活动总结
2014/07/08 职场文书
五一劳动节活动总结
2015/02/09 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书