朴素贝叶斯算法的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多线程编程方式分析示例详解
Dec 06 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
深入浅析Python中的迭代器
Jun 04 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
Django REST framework 单元测试实例解析
Nov 07 Python
python默认参数调用方法解析
Feb 09 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 Python
Python jiaba库的使用详解
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解析目录路径的3个函数总结
2014/11/18 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
python装饰器代替set get方法实例
2019/12/19 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
企业门卫岗位职责
2013/12/12 职场文书
消防标语大全
2014/06/07 职场文书
大学英语专业求职信
2014/06/21 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
钱学森电影观后感
2015/06/04 职场文书
禁毒心得体会范文
2016/01/15 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python