朴素贝叶斯算法的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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Python中的localtime()方法使用详解
May 22 Python
qpython3 读取安卓lastpass Cookies
Jun 19 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
Python自动化爬取天眼查数据的实现
Jun 15 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
浅谈js中的this问题
2017/08/31 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
js实现转动骰子模型
2019/10/24 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
python使用心得之获得github代码库列表
2014/06/25 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
会计出纳员的自我评价
2014/01/15 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏