朴素贝叶斯算法的实例

贝叶斯的应用

  • 过滤垃圾邮件

    贝叶斯分类器的著名的应用就是垃圾邮件过滤了,这方面推荐想详细了解的可以去看看《黑客与画家》或是《数学之美》中对应的章节,贝叶斯的基础实现看这里

    数据集

    两个文件夹,分别是正常邮件和垃圾邮件,其中各有25封邮件

    测试方法

    从50封邮件中随机选取10封做为测试数据

    实现细节


    1.首先我们需要将文本转成我们需要的向量的样子,这里需要使用一点正则表达式
    2.由于采取交叉验证的方式,随机过程会导致每次的结果不尽相同

  1 #coding=utf-8
  2 from numpy import *
  3
  4 #解析文档的函数
  5 def textParse(bigString):
  6     import re
  7     listOfTokens = re.split(r‘\W*‘,bigString)
  8     return [tok.lower() for tok in listOfTokens if len(tok) > 2]
  9
 10
 11 #创建一个带有所有单词的列表
 12 def createVocabList(dataSet):
 13     vocabSet = set([])
 14     for document in dataSet:
 15         vocabSet = vocabSet | set(document)
 16     return list(vocabSet)
 17
 18 def setOfWords2Vec(vocabList, inputSet):
 19     retVocabList = [0] * len(vocabList)
 20     for word in inputSet:
 21         if word in vocabList:
 22             retVocabList[vocabList.index(word)] = 1
 23         else:
 24             print ‘word ‘,word ,‘not in dict‘
 25     return retVocabList
 26
 27 #另一种模型
 28 def bagOfWords2VecMN(vocabList, inputSet):
 29     returnVec = [0]*len(vocabList)
 30     for word in inputSet:
 31         if word in vocabList:
 32             returnVec[vocabList.index(word)] += 1
 33     return returnVec
 34
 35 def trainNB0(trainMatrix,trainCatergory):
 36     numTrainDoc = len(trainMatrix)
 37     numWords = len(trainMatrix[0])
 38     pAbusive = sum(trainCatergory)/float(numTrainDoc)
 39     #防止多个概率的成绩当中的一个为0
 40     p0Num = ones(numWords)
 41     p1Num = ones(numWords)
 42     p0Denom = 2.0
 43     p1Denom = 2.0
 44     for i in range(numTrainDoc):
 45         if trainCatergory[i] == 1:
 46             p1Num +=trainMatrix[i]
 47             p1Denom += sum(trainMatrix[i])
 48         else:
 49             p0Num +=trainMatrix[i]
 50             p0Denom += sum(trainMatrix[i])
 51     p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零
 52     p0Vect = log(p0Num/p0Denom)
 53     return p0Vect,p1Vect,pAbusive
 54
 55 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
 56     p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
 57     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
 58     if p1 > p0:
 59         return 1
 60     else:
 61         return 0
 62
 63 def spamTest(spamFloder, hamFloder):
 64     docList = []
 65     classList = []
 66     fullText = []
 67     for i in range(1,26):
 68         wordList = textParse(open(spamFloder+str(i)+‘.txt‘).read())
 69         docList.append(wordList)
 70         fullText.extend(wordList)
 71         classList.append(1)
 72         wordList = textParse(open(hamFloder+str(i)+‘.txt‘).read())
 73         docList.append(wordList)
 74         fullText.extend(wordList)
 75         classList.append(0)
 76     vocabList = createVocabList(docList)
 77     trainingSet = range(50)
 78     testSet = []
 79     for i in range(10):
 80         randIndex = int(random.uniform(0,len(trainingSet)))
 81         testSet.append(trainingSet[randIndex])
 82         del(trainingSet[randIndex])
 83     trainMat = []
 84     trianClasses = []
 85     print trainingSet
 86     for docIndex in trainingSet:
 87         trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))
 88         #trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
 89         trianClasses.append(classList[docIndex])
 90     p0V,p1V,pSpam = trainNB0(array(trainMat),array(trianClasses))
 91     errorCount = 0
 92     for docIndex in testSet:        #classify the remaining items
 93         #wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
 94         wordVector = setOfWords2Vec(vocabList, docList[docIndex])
 95         if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
 96             errorCount += 1
 97             print "classification error",docList[docIndex]
 98     print ‘the error rate is: ‘,float(errorCount)/len(testSet)
 99     #return vocabList,fullText
100
101
102 def main():
103     spamTest(‘email/spam/‘,‘email/ham/‘)
104
105 if __name__ == ‘__main__‘:
106     main()
  • 从个人广告中获取地区倾向

    这个是从某个网站上提取了不同地区板块的信息,分析他们的用词是不是有某些规律

    数据集

    这里的数据使用RSS获取的,用到了python的feedparse包,想了解可以看这里.这里分别获取了某网站两个地区板块中的信息

    测试方法

    交叉验证

    实现细节


    1.这里有两种字符需要特别处理(其实他们有很大重合),一种是频率最高的一些,另一种是所谓的停用词(我的理解其实就是那些使用频率很高但没什么实际意义的),各种语言的停用词可以看这里
    我们需要移除这些词以使得结果更能体现出地区差异。
    2.getTopWords函数实际上就是对这个概率统计了一下特征。对学习贝叶斯来说不是必要代码
    3.除了数据来源不同实现细节和上面的很相似

  1.   1 #coding=utf-8
      2 from numpy import *
      3
      4 #解析文档的函数
      5 def textParse(bigString):
      6     import re
      7     listOfTokens = re.split(r‘\W*‘,bigString)
      8     return [tok.lower() for tok in listOfTokens if len(tok) > 2]
      9
     10
     11 #创建一个带有所有单词的列表
     12 def createVocabList(dataSet):
     13     vocabSet = set([])
     14     for document in dataSet:
     15         vocabSet = vocabSet | set(document)
     16     return list(vocabSet)
     17
     18 def setOfWords2Vec(vocabList, inputSet):
     19     retVocabList = [0] * len(vocabList)
     20     for word in inputSet:
     21         if word in vocabList:
     22             retVocabList[vocabList.index(word)] = 1
     23         else:
     24             print ‘word ‘,word ,‘not in dict‘
     25     return retVocabList
     26
     27 #另一种模型
     28 def bagOfWords2VecMN(vocabList, inputSet):
     29     returnVec = [0]*len(vocabList)
     30     for word in inputSet:
     31         if word in vocabList:
     32             returnVec[vocabList.index(word)] += 1
     33     return returnVec
     34
     35 def trainNB0(trainMatrix,trainCatergory):
     36     numTrainDoc = len(trainMatrix)
     37     numWords = len(trainMatrix[0])
     38     pAbusive = sum(trainCatergory)/float(numTrainDoc)
     39     #防止多个概率的成绩当中的一个为0
     40     p0Num = ones(numWords)
     41     p1Num = ones(numWords)
     42     p0Denom = 2.0
     43     p1Denom = 2.0
     44     for i in range(numTrainDoc):
     45         if trainCatergory[i] == 1:
     46             p1Num +=trainMatrix[i]
     47             p1Denom += sum(trainMatrix[i])
     48         else:
     49             p0Num +=trainMatrix[i]
     50             p0Denom += sum(trainMatrix[i])
     51     p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零
     52     p0Vect = log(p0Num/p0Denom)
     53     return p0Vect,p1Vect,pAbusive
     54
     55 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
     56     p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
     57     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
     58     if p1 > p0:
     59         return 1
     60     else:
     61         return 0
     62
     63 def stopWords():
     64     stopW = []
     65     f = open(‘stopwords.txt‘).readlines()
     66     for eachLine in f:
     67         stopW.append(eachLine[:-1])
     68     return stopW
     69
     70 def calcMostFreq(vocabList,fullText):
     71     import operator
     72     freqDict = {}
     73     for token in vocabList:
     74         freqDict[token]=fullText.count(token)
     75     sortedFreq = sorted(freqDict.iteritems(), key=operator.itemgetter(1), reverse=True)
     76     return sortedFreq[:30]
     77
     78 def localWords(rss1,rss0):
     79     import feedparser
     80     feed1 = feedparser.parse(rss1)
     81     feed0 = feedparser.parse(rss0)
     82     docList=[]; classList = []; fullText =[]
     83     minLen = min(len(feed1[‘entries‘]),len(feed0[‘entries‘]))
     84     for i in range(minLen):
     85         wordList = textParse(feed1[‘entries‘][i][‘summary‘])
     86         docList.append(wordList)
     87         fullText.extend(wordList)
     88         classList.append(1) #NY is class 1
     89         wordList = textParse(feed0[‘entries‘][i][‘summary‘])
     90         docList.append(wordList)
     91         fullText.extend(wordList)
     92         classList.append(0)
     93     vocabList = createVocabList(docList)#create vocabulary
     94     top30Words = calcMostFreq(vocabList,fullText)   #remove top 30 words
     95     for pairW in top30Words:
     96         if pairW[0] in vocabList: vocabList.remove(pairW[0])
     97     stopW = stopWords()
     98     for pairW in stopW:
     99         if pairW[0] in vocabList:
    100             vocabList.remove(pairW[0])
    101     trainingSet = range(2*minLen); testSet=[]           #create test set
    102     for i in range(20):
    103         randIndex = int(random.uniform(0,len(trainingSet)))
    104         testSet.append(trainingSet[randIndex])
    105         del(trainingSet[randIndex])
    106     trainMat=[]; trainClasses = []
    107     for docIndex in trainingSet:#train the classifier (get probs) trainNB0
    108         trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
    109         trainClasses.append(classList[docIndex])
    110     p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
    111     errorCount = 0
    112     for docIndex in testSet:        #classify the remaining items
    113         wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
    114         if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
    115             errorCount += 1
    116     print ‘the error rate is: ‘,float(errorCount)/len(testSet)
    117     return vocabList,p0V,p1V
    118
    119 def getTopWords(ny,sf):
    120     import operator
    121     vocabList,p0V,p1V=localWords(ny,sf)
    122     topNY=[]; topSF=[]
    123     for i in range(len(p0V)):
    124         if p0V[i] > -6.0 : topSF.append((vocabList[i],p0V[i]))
    125         if p1V[i] > -6.0 : topNY.append((vocabList[i],p1V[i]))
    126     sortedSF = sorted(topSF, key=lambda pair: pair[1], reverse=True)
    127     print "SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**"
    128     for item in sortedSF:
    129         print item[0]
    130     sortedNY = sorted(topNY, key=lambda pair: pair[1], reverse=True)
    131     print "NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**"
    132     for item in sortedNY:
    133         print item[0]
    134
    135 def main():
    136     #print stopWords()
    137     localWords(‘http://newyork.craigslist.org/stp/index.rss‘,‘http://sfbay.craigslist.org/stp/index.rss‘)
    138
    139 if __name__ == ‘__main__‘:
    140     main()

来自为知笔记(Wiz)

时间: 2024-11-05 23:29:22

朴素贝叶斯算法的实例的相关文章

朴素贝叶斯算法 & 应用实例

转载请注明出处:http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段就要把基础知识都带上. 机器学习在大数据浪潮中逐渐展示她的魅力,其实<概率论>.<微积分>.<线性代数>.<运筹学>.<信息论>等几门课程算是前置课程,当然要转化为工程应用的话,编程技能也是需要的,而作为信息管理专业的同学,对于信息的理解.数据的敏感都是很好

挖掘算法(1)朴素贝叶斯算法

原文:http://www.blogchong.com/post/NaiveBayes.html 1 文档说明 该文档为朴素贝叶斯算法的介绍和分析文档,并且结合应用实例进行了详细的讲解. 其实朴素贝叶斯的概念以及流程都被写烂了,之所以写这些是方便做个整理,记录备忘.而实例部分进行了详细的描述,网络上该实例比较简单,没有过程. 至于最后部分,则是对朴素贝叶斯的一个扩展了,当然只是简单的描述了一下过程,其中涉及到的中文分词以及TFIDF算法,有时间再具体补上. 2 算法介绍 2.1 贝叶斯定理 (1

朴素贝叶斯算法资料整理和PHP 实现版本

朴素贝叶斯算法简洁 http://blog.csdn.net/xlinsist/article/details/51236454 引言 先前曾经看了一篇文章,一个老外程序员写了一些很牛的Shell脚本,包括晚下班自动给老婆发短信啊,自动冲Coffee啊,自动扫描一个DBA发来的邮件啊, 等等.于是我也想用自己所学来做一点有趣的事情.我的想法如下: 首先我写个scrapy脚本来抓取某个网站上的笑话 之后写个Shell脚本每天早上6点自动抓取最新的笑话 然后用朴素贝叶斯模型来判断当前的笑话是否属于成

Step by Step 改进朴素贝叶斯算法

引言 如果你对naive bayes认识还处于初级阶段,只了解基本的原理和假设,还没有实现过产品级的代码,那么这篇文章能够帮助你一步步对原始的朴素贝叶斯算法进行改进.在这个过程中你将会看到朴素贝叶斯假设的一些不合理处以及局限性,从而了解为什么这些假设在简化你的算法的同时,使最终分类结果变得糟糕,并针对这些问题提出了改进的方法. 朴素贝叶斯(Naive Bayes) 出处: <机器学习>(Machine Learning by Tom M.Mitchell) 符号和术语 假设待分类的实例 X 可

利用朴素贝叶斯算法进行分类-Java代码实现

http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) Java package cn.crocro.classifier; import java.util.ArrayList; /** * 朴素贝叶斯分类器,只能针对有限个情况的分类下面是实例代码 * * @author 鳄鱼 * */ public class NaiveBayesClassifier

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

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

朴素贝叶斯算法 原理及推导

朴素贝叶斯算法主要用来解决分类问题,比如通常的二分类,多分类. 1.数学知识: 贝叶斯定理: 特征条件独立: 1.朴素贝叶斯 输入空间: 输出空间:y={C1,C2,…,CK}. 训练集:T={(x1,y1),(x2,y2),…,(xN,yN)}. 对于每个实例,其P(X,Y)独立同分布.在进行分类之前,需要先将计算先验概率和条件概率然后据此计算出后验概率. 1)先验概率分布: P(Y=Ck),k=1,2,..,K. 先验概率的极大似然估计: 2)条件概率分布: 设第j个特征可能取值的集合为:{

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

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

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

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 个属性: