朴素贝叶斯算法的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中序列与字典的相同和不同之处
Jan 19 Python
Python切片工具pillow用法示例
Mar 30 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python使用turtle绘制分形树
Jun 22 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
python如何实现从视频中提取每秒图片
Oct 22 Python
python实现静态web服务器
Sep 03 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
python 的numpy库中的mean()函数用法介绍
Mar 03 Python
python turtle绘图命令及案例
Nov 23 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 常用类整理
2009/12/23 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
简单谈谈favicon
2015/06/10 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
区优秀教师事迹材料
2014/02/10 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
保护环境建议书100字
2014/05/13 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang