朴素贝叶斯算法的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海龟绘图实例教程
Jul 24 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
python实现实时监控文件的方法
Aug 26 Python
全面了解python中的类,对象,方法,属性
Sep 11 Python
python实现读Excel写入.txt的方法
Apr 29 Python
Python文件读写常见用法总结
Feb 22 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
基于python实现复制文件并重命名
Sep 16 Python
Python读取pdf表格写入excel的方法
Jan 22 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
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
jQuery 使用手册(二)
2009/09/23 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
ExpressJS入门实例
2015/01/14 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
开始着手第一个Django项目
2015/07/15 Python
python 编写简单网页服务器的实例
2018/06/01 Python
Django中多种重定向方法使用详解
2019/07/17 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
Python 实现自动导入缺失的库
2019/10/29 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python 实现单例模式的5种方法
2020/09/23 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
优秀党支部书记事迹材料
2014/05/29 职场文书
欢迎标语大全
2014/06/21 职场文书
班级读书活动总结
2014/06/30 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
张丽莉事迹观后感
2015/06/16 职场文书