朴素贝叶斯算法的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中的startswith和endswith函数使用实例
Aug 25 Python
django框架如何集成celery进行开发
May 24 Python
python实现外卖信息管理系统
Jan 11 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
儿童python练习实例
May 27 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
Django Model中字段(field)的各种选项说明
May 19 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python实现滑雪小游戏
Sep 25 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源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
jQuery 入门讲解1
2009/04/15 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
python定时执行指定函数的方法
2015/05/27 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
pip安装python库的方法总结
2019/08/02 Python
美德好少年主要事迹
2014/01/29 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
计划生育标语
2014/06/23 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
教师节晚会主持词
2015/06/30 职场文书
公司出差管理制度范本
2015/08/05 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
Python快速实现一键抠图功能的全过程
2021/06/29 Python