朴素贝叶斯算法的python实现方法

本文实例讲述了朴素贝叶斯算法的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)

根据贝叶斯公式计算这个向量属于两个集合中哪个的概率高

代码如下:

#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实现方法的更多相关文章

  1. 朴素贝叶斯算法的python实现

    朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么 ...

  2. 朴素贝叶斯算法的python实现-乾颐堂

    算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯 比如我们想判断一个邮件是不是垃圾邮件,那么我们知道的 ...

  3. 朴素贝叶斯算法的python实现 -- 机器学习实战

    import numpy as np import re #词表到向量的转换函数 def loadDataSet(): postingList = [['my', 'dog', 'has', 'fle ...

  4. 朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  5. 朴素贝叶斯算法--python实现

    朴素贝叶斯算法要理解一下基础:    [朴素:特征条件独立   贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.]   极大似然估计 ...

  6. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

  7. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  8. 机器学习:python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实 ...

  9. 机器学习---用python实现朴素贝叶斯算法(Machine Learning Naive Bayes Algorithm Application)

    在<机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)>一文中,我们介绍了朴素贝叶斯分类器的原理.现在,让我们来实践一下. 在 ...

随机推荐

  1. 16-MySQL-Ubuntu-数据表的查询-分组与聚合(五)

    分组(group by)一般与聚合结合使用 (1)查询按性别分组 select gender from students group by gender; (2)查询按性别分组并统计每组的数量sele ...

  2. 【LGP5439】【XR-2】永恒

    题目 是个傻题 显然枚举每一条路径经过了多少次,如果\(u,v\)在树上不是祖先关系的话经过\((u,v)\)这条路径的路径条数就是\(sum_u\times sum_v\) 于是我们子树大小映射到\ ...

  3. Alice拜年 模板题 /// 最短路Dijk oj1344

    题目大意: 大年初一,Alice带上拜年礼物去给N-1位亲朋好友长辈拜年,亲友真多啊,是个大家族.由于Alice才2岁,力气不大,每次只能拿一份礼物,拜完年之后,要回家取第二份礼物,然后去下一家拜年( ...

  4. cms系统视频分享

    cms_001-CMS系统功能需求简介-1.avicms_002-如何采用用例分析方法来理解需求-1.avicms_003-后台管理系统用例-1.avicms_004-实现验证码的初步思路-1.avi ...

  5. 2019-5-8-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因...

    title author date CreateTime categories WPF 绑定命令在 MVVM 的 CanExecute 和 Execute 在按钮点击都没触发可能的原因 lindexi ...

  6. 2019云栖大会开幕,5G边缘计算成首日焦点

    9月25日,全球顶尖科技盛会——2019云栖大会如期上演,1000余位当代技术领军人物与数万名开发者集结杭州,聚焦数字经济,共话面向未来20年的基础科学.科技创新与应用突破.其中,边缘计算技术领域因5 ...

  7. thinkphp 模块化设计

    一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器. ThinkPHP3.2采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块 ...

  8. 锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘(强制关机后引起的问题)

    电脑强制关机后,centos系统启动失败,报异常:锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘.解决办法:进入D:\vms\S1目录,删除下 ...

  9. try-catch 捕捉不到异常

    code: int _tmain(int argc, _TCHAR* argv[]) { cout << "In main." << endl;  //定义 ...

  10. selenium python bindings 写测试用例

    这章总结selenium在UI测试方面的用法 import unittest from selenium import webdriver from selenium.webdriver.common ...