朴素贝叶斯算法的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实现简单温度转换的方法
Mar 13 Python
Python删除windows垃圾文件的方法
Jul 14 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
Python基于execjs运行js过程解析
Nov 27 Python
python中类与对象之间的关系详解
Dec 16 Python
浅谈Python项目的服务器部署
Apr 25 Python
pytorch 实现在测试的时候启用dropout
May 27 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
python脚本开机自启的实现方法
2019/06/28 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
关于孝道的演讲稿
2014/05/21 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
街道社区活动报告
2015/02/05 职场文书
2016年元旦主持词
2015/07/06 职场文书
开业庆典致辞
2015/08/01 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python