机器学习 Python实现 贝叶斯算法

[[‘my‘,‘dog‘,‘has‘,‘flea‘,‘problems‘,‘help‘,‘please‘],    0

[‘maybe‘,‘not‘,‘take‘,‘him‘,‘to‘,‘dog‘,‘park‘,‘stupid‘],
 1

[‘my‘,‘dalmation‘,‘is‘,‘so‘,‘cute‘,‘I‘,‘love‘,‘him‘],
         0

[‘stop‘,‘posting‘,‘stupid‘,‘worthless‘,‘garbage‘],          1

[‘mr‘,‘licks‘,‘ate‘,‘my‘,‘steak‘,‘how‘,‘to‘,‘stop‘,‘him‘],
 0

[‘quit‘,‘buying‘,‘worthless‘,‘dog‘,‘food‘,‘stupid‘]]           1

以上是六句话,标记是0句子的表示正常句,标记是1句子的表示为粗口。我们通过分析每个句子中的每个词,在粗口句或是正常句出现的概率,可以找出那些词是粗口。

注意:主要从以下两点对分类器进行修改

<1>贝叶斯概率需要计算多个概率的乘积以获得文档属于某个类别的概率,即计算p(w0|1)p(w1|1)p(w2|1)。如果其中一个概率值为0,那么最后的乘积也为0

<2>第二个问题就是下溢出,这是由于太多过小的数相乘造成的。由于大部分因子都非常小,所以程序会下溢出或者得不到正确的答案。解决办法是对乘积取自然对数这样可以避免下溢出或者浮点数舍入导致的错误。

<3>每个单词的出现与否作为一个特征,被称为词集模型;在词袋模型中,每个单词可以出现多次。

贝叶斯理论就是通过可以求得的后验概率计算前验概率

这里用到的朴素贝叶斯理论有两个前提

特征之间相互独立

特征之间同等重要

# -*- coding: cp936 -*-
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]
    return postingList, classVec  

# 创建一个包含在所有文档中出现的不重复词的列表
def createVocabList(dataSet):
    vocabSet = set([])      #创建一个空集
    for document in dataSet:
        vocabSet = vocabSet | set(document)   #创建两个集合的并集
    return list(vocabSet)  

#将文档词条转换成词向量
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)        #创建一个其中所含元素都为0的向量
    for word in inputSet:
        if word in vocabList:
            #returnVec[vocabList.index(word)] = 1     #index函数在字符串里找到字符第一次出现的位置  词集模型
            returnVec[vocabList.index(word)] += 1      #文档的词袋模型    每个单词可以出现多次
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

#朴素贝叶斯分类器训练函数   从词向量计算概率
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix)  #文本数量
    numWords = len(trainMatrix[0])   #文本中词汇数量也是词库的大小
    pAbusive = sum(trainCategory)/float(numTrainDocs)  #P(wi)
   # p0Num = zeros(numWords); p1Num = zeros(numWords)
    #p0Denom = 0.0; p1Denom = 0.0
    p0Num = ones(numWords); p1Num = ones(numWords)#避免一个概率值为0,最后的乘积也为0
    p0Denom = 2.0; p1Denom = 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]  #按行进行相加,每个词汇自己计算总数
            p1Denom += sum(trainMatrix[i])  #所有词汇一共出现的次数
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    #p1Vect = p1Num / p1Denom
    #p0Vect = p0Num / p0Denom   #计算获得p(wi|c1),p(wi|c0)
    #print (p1Num)
    #print (p1Denom)
    p1Vect = log(p1Num / p1Denom)
    p0Vect = log(p0Num / p0Denom)      #避免下溢出或者浮点数舍入导致的错误   下溢出是由太多很小的数相乘得到的
    return p0Vect, p1Vect, pAbusive

#朴素贝叶斯分类器
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):  #vec2Classify表示需要分类的向量
    p1 = sum(vec2Classify*p1Vec) + log(pClass1)
    p0 = sum(vec2Classify*p0Vec) + log(1.0-pClass1)
    if p1 > p0:
        return 1
    else: return 0  

def test():
    listPosts,listClasses = loadDataSet()
    myVocablist = createVocabList(listPosts)
    set1 = setOfWords2Vec(myVocablist,listPosts[0])
    #print(set1)
    set2 = setOfWords2Vec(myVocablist,listPosts[1])
    #print(set2)
    trainMat = []
    for postinDoc in listPosts:
        trainMat.append(setOfWords2Vec(myVocablist,postinDoc))
    #print(trainMat)
    #print(listClasses)
    p0V,p1V,pAb = trainNB0(trainMat,listClasses)
    print(pAb)
    print(p1V)
    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 textParse(bigString):      #正则表达式进行文本分割
    import re
    listOfTokens = re.split(r'\W*',bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]  

def spamTest():
    docList = []; classList = []; fullText = []
    for i in range(1,26):                          #导入并解析文本文件
        wordList = textParse(open('E:/python project/Bayes/email/spam/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('E:/python project/Bayes/email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = createVocabList(docList)
    trainingSet = range(50);testSet = []
    for i in range(10):                         #随机构建10个测试集
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat = []; trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))
    errorCount = 0
    for docIndex in testSet:              #对测试集进行分类
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])
        if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:
            errorCount += 1
    print 'the error rate is: ', float(errorCount)/len(testSet)
时间: 2024-10-08 12:33:05

机器学习 Python实现 贝叶斯算法的相关文章

机器学习之朴素贝叶斯算法

1 贝叶斯定理的引入 概率论中的经典条件概率公式: 公式的理解为,P(X ,Y)= P(Y,X)<=> P(X | Y)P(Y)= P(Y | X)P (X),即 X 和 Y 同时发生的概率与 Y 和 X 同时发生的概率一样. 2 朴素贝叶斯定理 朴素贝叶斯的经典应用是对垃圾邮件的过滤,是对文本格式的数据进行处理,因此这里以此为背景讲解朴素贝叶斯定理.设D 是训练样本和相关联的类标号的集合,其中训练样本的属性集为          X { X1,X2, ... , Xn }, 共有n 个属性:

吴裕雄--天生自然python机器学习:朴素贝叶斯算法

分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同 时给出这个猜测的概率估计值. 概率论是许多机器学习算法的基础 在计算 特征值取某个值的概率时涉及了一些概率知识,在那里我们先统计特征在数据集中取某个特定值 的次数,然后除以数据集的实例总数,就得到了特征取该值的概率. 首先从一个最简单的概率分类器开始,然后给 出一些假设来学习朴素贝叶斯分类器.我们称之为“朴素”,是因为整个形式化过程只做最原始.最简单的假设. 基于贝叶斯决策理论的分类方法 朴素贝叶斯是贝叶斯决策理论的一部

Stanford机器学习[第六讲]-朴素贝叶斯算法

引文:由于之前讲过了朴素贝叶斯的理论Stanford机器学习[第五讲]-生成学习算法第四部分,同时朴素贝叶斯的算法实现也讲过了,见机器学习算法-朴素贝叶斯Python实现.那么这节课打算讲解一下朴素贝叶斯算法的具体计算流程,通过一个具体的实例来讲解. PS:为了专注于某一个细节,本章节只抽取了视频的一部分来讲解,只讲解一个贝叶斯算法的计算流程,关于视频里面的具体内容请参考下面的视频链接. 讲解的实例是一个文本分类的例子,区分一句话是粗鲁的还是文明的,类别标签只有Yes或No,表示是粗鲁的和不是粗

通俗易懂机器学习——朴素贝叶斯算法

本文将叙述朴素贝叶斯算法的来龙去脉,从数学推导到计算演练到编程实战 文章内容有借鉴网络资料.李航<统计学习方法>.吴军<数学之美>加以整理及补充 基础知识补充: 1.贝叶斯理论–吴军数学之美 http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 2.条件概率 3.联合分布 朴素贝叶斯算法 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的 分类方法.给定训练数据集,首先基于特征条件独立假设学习 输入/输出的联合概率分布

机器学习笔记-------贝叶斯算法1

Hello,我就是人见人爱,花见花开,蜜蜂见了会打转的小花..哈哈,我们终于讲到了当年大学让我头痛不已的贝叶斯.先给个模型: 一:贝叶斯定理 维基百科定义:贝叶斯定理(英语:Bayes' theorem)是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关.在有些关于概率的解说中,贝叶斯定理(贝叶斯更新)能够告知我们如何利用新证据修改已有的看法.这个名称来自于托马斯·贝叶斯. 通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的:然而,这两者是有确定的

斯坦福《机器学习》Lesson5感想———2、朴素贝叶斯算法

朴素贝叶斯算法与上篇中写到到生成学习算法的思想是一致的.它不需要像线性回归等算法一样去拟合各种假设的可能,只需要计算各种假设的概率,然后选择概率最高的那种假设分类类别.其中还添入了一个贝叶斯假定:在给定目标值y时属性值x之间相互独立.这样的分类算法被称为朴素贝叶斯分类器(Naive Bayes classifier)  . 1.朴素贝叶斯算法 在朴素贝叶斯算法的模型里,给定的训练集为, 可计算,.因为贝叶斯假定,可以计算出联合似然概率函数: 最大化联合似然概率函数可得到: 然后我们就可以对新的数

机器学习之实战朴素贝叶斯算法

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类,而朴素贝叶斯分类可谓是里面最简单.入门的一种. 首先关于贝叶斯定理,感觉简单而伟大,前些天一直在看吴军的数学之美(没看过的极力推荐)系列文章,看到自然语言处理从规则模型到统计模型转变的时候,语言的识别准确率上升好几个等级,以至于今天的语言识别到达很强大的地步,同时对于搜索引擎,网页搜索的准确率,也上升好多.这其中的最最重要的就是使用了贝叶斯准则,运用一种统计学的概念,将识别搜索的结果可能性最大化.由此我联想到当今的

机器学习回顾篇(5):朴素贝叶斯算法

1 引言 说到朴素贝叶斯算法,很自然地就会想到贝叶斯概率公式,这是我们在高中的时候就学过的只是,没错,这也真是朴素贝叶斯算法的核心,今天我们也从贝叶斯概率公式开始,全面撸一撸朴素贝叶斯算法. 2 贝叶斯概率公式 2.1 联合概率与全概率公式 定义1:完备事件组 ${A_1} \cup {A_2} \cup \cdots \cup {A_n} = \Omega $,且${A_i} \cap {A_j} = \emptyset ,1 \le i \ne j \le n$,则称${A_1},{A_2}

机器学习--朴素贝叶斯算法原理、方法及代码实现

一.朴素的贝叶斯算法原理 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据,朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种,朴素的意思是条件概率独立性. 条件概率的三个重要公式: (1)概率乘法公式: P(AB)= P(B) P(A|B) = P(A) P(B|A) =P(BA) (2)全概率公式:        (3)贝叶斯公式:            如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A,这就是朴素贝叶斯的基本思想. 二.算法步骤 (