朴素贝叶斯算法的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从入门到精通(DAY 2)
Dec 20 Python
Python冲顶大会 快来答题!
Jan 17 Python
python网络爬虫学习笔记(1)
Apr 09 Python
使用django实现一个代码发布系统
Jul 18 Python
python 实现单通道转3通道
Dec 03 Python
Python&&GDAL实现NDVI的计算方式
Jan 09 Python
python在不同条件下的输入与输出
Feb 13 Python
用 Python 制作地球仪的方法
Apr 24 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
python与pycharm有何区别
Jul 01 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 Python
梳理总结Python开发中需要摒弃的18个坏习惯
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实现利用MySQL保存session的方法
2014/08/23 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
extjs fckeditor集成代码
2009/05/10 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
python模块导入的细节详解
2018/12/10 Python
Python中的self用法详解
2019/08/06 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
公务员培训心得体会
2013/12/28 职场文书
绩效工资实施方案
2014/03/15 职场文书
68句权威创业名言
2019/08/26 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL