朴素贝叶斯算法的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 29 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python面试题小结附答案实例代码
Apr 11 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
python模块常用用法实例详解
Oct 17 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
iPython pylab模式启动方式
Apr 24 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Python中的特殊方法以及应用详解
Sep 20 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
php批量上传的实现代码
2013/06/09 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
详解Python传入参数的几种方法
2019/05/16 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
Pandas分组与排序的实现
2019/07/23 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python