朴素贝叶斯算法的python实现方法_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程序设计有所帮助。

时间: 2024-09-16 15:19:25

朴素贝叶斯算法的python实现方法_python的相关文章

java weka 朴素贝叶斯算法 数据分类问题

问题描述 java weka 朴素贝叶斯算法 数据分类问题 现在有一个需求需要实现如下功能: 根据x,y,z的值得到状态,比如:0.5,0.1,0.2 状态是sit;0.6,0.1,0.2 状态是stand. 后来上网查到weka这个东西,因为我对算法确实不太了解,也没看懂,只能模仿. 我有一个训练样本,命名test1.arff,内容的一部分如下: @relation test1 @attribute x numeric @attribute y numeric @attribute z num

程序-基于朴素贝叶斯算法的java软件实现

问题描述 基于朴素贝叶斯算法的java软件实现 做一个exe的能够实现朴素贝叶斯算法的软件,求源程序,需要用到那些包可以标注下 解决方案 http://download.csdn.net/detail/walking56849/6972831http://blog.csdn.net/xceman1997/article/details/7955349

朴素贝叶斯算法

我们来约定一下: S: 邮件为垃圾邮件的概率 V: 邮件含有'viagra'词的概率 贝叶斯会告诉我们已知这个邮件含有viagra词,判断为垃圾邮件的概率: 假设垃圾邮件和非垃圾邮件的概率都是0.5,即: 则通过上面的公式得到: 假设50%的垃圾邮件中有'vargra',只有1%的非垃圾邮件中含有这个单词,问这个邮件是垃圾邮件的概率: 可见,含有这个单词一般都是垃圾邮件. 更加精致的邮件分类器 想象一下我们有一堆字母,,我们使用Xi表示一封信中含有此词的概率.同样,表示垃圾邮件中含有单词的概率,

Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法

网易公开课,第5,6课  notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 前面讨论了高斯判别分析,是一种生成学习算法,其中x是连续值  这里要介绍第二种生成学习算法,Naive Bayes算法,其中x是离散值的向量  这种算法常用于文本分类,比如分类垃圾邮件 首先,如何表示一个文本,即x?   以上面这种向量来表示,字典中的词是否在该文本中出现  其中每个词,可以看作是一个特征,对于特征的选取,可以过滤到stop word,或只选取出

详解基于朴素贝叶斯的情感分析及 Python 实现

相对于「 基于词典的分析 」,「 基于机器学习 」的就不需要大量标注的词典,但是需要大量标记的数据,比如: 还是下面这句话,如果它的标签是: 服务质量 - 中 (共有三个级别,好.中.差) ╮(╯-╰)╭,其是机器学习,通过大量已经标签的数据训练出一个模型, 然后你在输入一条评论,来判断标签级别 宁馨的点评 国庆活动,用62开头的信用卡可以6.2元买一个印有银联卡标记的冰淇淋, 有香草,巧克力和抹茶三种口味可选,我选的是香草口味,味道很浓郁. 另外任意消费都可以10元买两个马卡龙,个头虽不是很大

朴素贝叶斯分类器

  所谓分类,就是根据事物的特征(Feature)对其归类(Class)    特征的数据特点有两种可能: 1. 离散/标签 2. 连续/浮点数(大样本/小样本)   下面我们分别来看 一.离散/标签 这是一个病人分类的例子 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒 打喷嚏 农夫 过敏 头痛 建筑工人 脑震荡 头痛 建筑工人 感冒 打喷嚏 教师 感冒 头痛 教师 脑震荡 现在又来了第七个病人,是一个打喷嚏的建筑工人.请问他患上感冒的概率有多大?   根据贝叶斯

简单通俗易懂:一个小例子完美解释Naive Bayes(朴素贝叶斯)分类器

更多深度文章,请关注:https://yq.aliyun.com/cloud 最简单的解决方案通常是最强大的解决方案,而朴素贝叶斯就是一个很好的证明.尽管机器学习在过去几年取得了巨大的进步,但朴素贝叶斯已被证明不仅简单,而且快速.准确.可靠.它已经成功地用于许多项目中,而且它对自然语言处理(NLP)的问题的解决提供了很大的帮助. 朴素贝叶斯是利用概率论和贝叶斯定理预测样本类别(如新闻或客户评论)的概率算法.它们是概率性的,这意味着它们计算给定样本的每个类别的概率,然后输出概率最高的样本类别.他们

统计学习方法笔记 -- 朴素贝叶斯

贝叶斯定理(Bayes theorem) 这是关于"逆概"或"后验概率"的定理,之所以需要这个定理是因为后验概率是以"果"来推导"因",所以往往难以直接统计出.  但是后验概率却非常重要,因为在现实生活中,往往都只能观测到一些表面的"果",需要去推断"因".  而bayes定理就给出一种计算后验概率的方法. 以例子来说明,一个班级中n个学生,有男生也有女生  两个features,短发;

使用pandas,7行代码实现朴素贝叶斯

作者:hhh5460 大抵分成两类 一.离散的.标签化的数据 原文没有使用pandas,我使用pandas重新实现了朴素贝叶斯算法,看起来非常简洁.清爽. import pandas as pd ''' 导入数据集 {a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1} {a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1} {a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1