今天介绍机器学习中一种基于概率的常见的分类方法,朴素贝叶斯,之前介绍的KNN, decision tree 等方法是一种 hard decision,因为这些分类器的输出只有0 或者 1,朴素贝叶斯方法输出的是某一类的概率,其取值范围在 0-1 之间,朴素贝叶斯在做文本分类,或者说垃圾邮件识别的时候非常有效。

朴素贝叶斯就是基于我们常用的贝叶斯定理:

p(x|y)=p(y|x)p(x)p(y)

假设我们要处理一个二分类问题: c1,c2,给定一个样本,比如说是一封邮件,可以用向量 x 来表示,邮件就是一个文本,而文本是由单词构成的,所以 x 其实包含了这封邮件里出现的单词的信息,我们要求的就是,给定样本 x ,我们需要判断这个样本是属于 c1 还是属于 c2,当然,我们可以用概率表示为:

p(c1|x)>=<p(c2|x)

这个就是我们常见的后验概率。根据贝叶斯定理,我们可以得到:

p(c|x)=p(x|c)p(c)p(x)

虽然,p(x) 我们无法得知,但是我们只要求出 p(x|c)p(c), 依然可以做出判断,p(x|c) 称为似然估计,而 p(c) 称为先验概率。

接下来,看看什么是朴素贝叶斯,假设 x 的维度为 n,即 x={x1,x2,...xn}, 那么,

p(x|c)=p(x1,x2,...xn|c)

一般来说,x1,x2,...xn 不会是完全相互独立不相关的,为了求解方便,朴素贝叶斯假设这些变量 x1,x2,...xn 是相互独立,或者说conditional independent , 那么上面的表达式可以写成:

p(x|c)=p(x1,x2,...xn|c)=p(x1|c)p(x2|c)...p(xn|c)

这就是我们说的朴素贝叶斯,接下来的就是各种统计了。

我们给出一个利用朴素贝叶斯做文本分类的例子:

首先建立一个数据库:

  1. def Load_dataset():
  2. postingList=[['my', 'dog', 'has', 'flea', \
  3. 'problems', 'help', 'please'],
  4. ['maybe', 'not', 'take', 'him', \
  5. 'to', 'dog', 'park', 'stupid'],
  6. ['my', 'dalmation', 'is', 'so', 'cute', \
  7. 'I', 'love', 'him'],
  8. ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
  9. ['mr', 'licks', 'ate', 'my', 'steak', 'how',\
  10. 'to', 'stop', 'him'],
  11. ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
  12. classVec = [0, 1, 0, 1, 0, 1]
  13. return postingList, classVec

接下来,我们建立一个字典库,保证每一个单词在这个字典库里都有一个位置索引,一般来说,字典库的大小,就是我们样本的维度大小:

  1. def Create_vocablist(dataset):
  2. vocabSet = set([])
  3. for document in dataset :
  4. vocabSet = vocabSet | set(document)
  5. return list(vocabSet)

我们可以将样本转成向量:一种方法是只统计该单词是否出现,另外一种是可以统计该单词出现的次数。

  1. def Word2Vec(vocabList, inputSet):
  2. returnVec = [0] * len(vocabList)
  3. for word in inputSet :
  4. if word in vocabList :
  5. returnVec[vocabList.index(word)] = 1
  6. else:
  7. print ("the word %s is not in the vocabulary" % word)
  8. return returnVec
  1. def BoW_Vec(vocabList, inputSet):
  2. returnVec = [0] * len(vocabList)
  3. for word in inputSet :
  4. if word in vocabList :
  5. returnVec[vocabList.index(word)] += 1
  6. else:
  7. print ("the word %s is not in the vocabulary" % word)
  8. return returnVec

接下来,我们建立分类器:这里需要注意的是,由于概率都是 0-1 之间的数,连续的相乘,会让最终结果趋于0,所以我们可以把概率相乘转到对数域的相加:

  1. def Train_NB(trainMat, trainClass) :
  2. Num_doc = len(trainMat)
  3. Num_word = len(trainMat[0])
  4. P_1 = sum(trainClass) / float(Num_doc)
  5. P0_num = np.zeros(Num_word) + 1
  6. P1_num = np.zeros(Num_word) + 1
  7. P0_deno = 2.0
  8. P1_deno = 2.0
  9. for i in range(Num_doc):
  10. if trainClass[i] == 1:
  11. P1_num += trainMat[i]
  12. P1_deno +=sum(trainMat[i])
  13. else:
  14. P0_num += trainMat[i]
  15. P0_deno += sum(trainMat[i])
  16. P1_vec = np.log(P1_num / P1_deno)
  17. P0_vec = np.log(P0_num / P0_deno)
  18. return P_1, P1_vec, P0_vec
  1. def Classify_NB(testVec, P0_vec, P1_vec, P1):
  2. p1 = sum(testVec * P1_vec) + math.log(P1)
  3. p0 = sum(testVec * P0_vec) + math.log(1-P1)
  4. if p1 > p0:
  5. return 1
  6. else:
  7. return 0
  8. def Text_parse(longstring):
  9. import re
  10. regEx = re.compile(r'\W*')
  11. Listoftokens = regEx.split(longstring)
  12. return [tok.lower() for tok in Listoftokens if len(tok)>0]
  13. # return Listoftokens

这里给出简单的测试:

  1. test_string = 'This book is the best book on Python or M.L.\
  2. I have ever laid eyes upon.'
  3. wordList = Text_parse(test_string)
  4. Mydata, classVec = Load_dataset()
  5. '''
  6. Doc_list = []
  7. Full_list = []
  8. for i in range (len(Mydata)):
  9. Doc_list.append(Mydata[i])
  10. Full_list.extend(Mydata[i])
  11. '''
  12. Vocablist = Create_vocablist(Mydata)
  13. Wordvec = Word2Vec(Vocablist, Mydata[0])
  14. trainMat = []
  15. for doc in Mydata:
  16. trainMat.append(Word2Vec(Vocablist, doc))
  17. P_1, P1_vec, P0_vec = Train_NB(trainMat, classVec)
  18. print Mydata
  19. print classVec
  20. print wordList

机器学习:朴素贝叶斯--python的更多相关文章

  1. 朴素贝叶斯python代码实现(西瓜书)

    朴素贝叶斯python代码实现(西瓜书) 摘要: 朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集特征为离散型属性的时候, 使用起来非常的方便.原理简单,训练效率高,拟合效果 ...

  2. Python之机器学习-朴素贝叶斯(垃圾邮件分类)

    目录 朴素贝叶斯(垃圾邮件分类) 邮箱训练集下载地址 模块导入 文本预处理 遍历邮件 训练模型 测试模型 朴素贝叶斯(垃圾邮件分类) 邮箱训练集下载地址 邮箱训练集可以加我微信:nickchen121 ...

  3. 朴素贝叶斯python实现

    概率论是非常多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是由于整个形式化过程中仅仅做最原始.简单的如果. (这个如果:问题中有非常多特征,我们简单如果一个个特征是独立的.该如果称做条件独立性, ...

  4. 朴素贝叶斯python小样本实例

    朴素贝叶斯优点:在数据较少的情况下仍然有效,可以处理多类别问题缺点:对于输入数据的准备方式较为敏感适用数据类型:标称型数据朴素贝叶斯决策理论的核心思想:选择具有最高概率的决策朴素贝叶斯的一般过程(1) ...

  5. spark 机器学习 朴素贝叶斯 实现(二)

    已知10月份10-22日网球场地,会员打球情况通过朴素贝叶斯算法,预测23,24号是否适合打网球.结果,日期,天气 温度 风速结果(0否,1是)天气(0晴天,1阴天,2下雨)温度(0热,1舒适,2冷) ...

  6. spark 机器学习 朴素贝叶斯 原理(一)

    朴素贝叶斯算法仍然是流行的挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些领域的分类问题中 ...

  7. 统计学习方法(李航)朴素贝叶斯python实现

    朴素贝叶斯法 首先训练朴素贝叶斯模型,对应算法4.1(1),分别计算先验概率及条件概率,分别存在字典priorP和condP中(初始化函数中定义).其中,计算一个向量各元素频率的操作反复出现,定义为c ...

  8. 机器学习---朴素贝叶斯与逻辑回归的区别(Machine Learning Naive Bayes Logistic Regression Difference)

    朴素贝叶斯与逻辑回归的区别: 朴素贝叶斯 逻辑回归 生成模型(Generative model) 判别模型(Discriminative model) 对特征x和目标y的联合分布P(x,y)建模,使用 ...

  9. 机器学习朴素贝叶斯 SVC对新闻文本进行分类

    朴素贝叶斯分类器模型(Naive Bayles) Model basic introduction: 朴素贝叶斯分类器是通过数学家贝叶斯的贝叶斯理论构造的,下面先简单介绍贝叶斯的几个公式: 先验概率: ...

随机推荐

  1. IE67实现inline-block布局

    inline-block可以定义元素为行内块级元素,即既具有行内元素同占一行的特点,又具有块级元素的box模型.但是IE67和其他浏览器的支持差别比较大: 1.行内元素使用inline-block变成 ...

  2. session 购物车

    package session; import java.io.IOException;import java.util.ArrayList;import java.util.List; import ...

  3. PHP下最好用的富文本HTML过滤器:HTMLPurifier使用教程

    HTMLPurifier是我目前用过最好的PHP富文本HTML过滤器了,采用了白名单机制,有效杜绝了用户提交表单中的非法HTML标签,从而可以防止XSS攻击! HTMLPurifier项目地址:htt ...

  4. 解决ListView滑动时出现黑边的问题

    [声明]转载请注明出处,此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --尊重作者,知识无价.交流无限! 两种方法 1.代码去边缘线 myList.setF ...

  5. linux下开启ftp的21号port

    1.先执行vsftpd服务: #service vsftpd start 2.通过iptables开放21号port (1) 先查看iptables设置: #iptables -nL Chain IN ...

  6. erlang中判断进程是否存活

    一个参数的方法是已知Pid判断进程是否存活.两个参数的方法是已知节点和Pid或进程名判断进程是否存活. is_process_alive(Pid) when is_pid(Pid)->rpc:c ...

  7. 在linux系统中I/O 调度的选择 (转)

    I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Completel ...

  8. webpack 样式分离之The root route must render a single element

    公司项目使用的是webpack1,使用extract-text-webpack-plugin 插件无法将css分离出来,检查原因,发现有如下代码 <Route path="/home& ...

  9. CI去掉 URL 中的 index.php

    首先,你要清楚自己的 Web 服务器是 Apache,支持 mod_rewrite 查找httpd.conf中是否开启了mod_rewrite.so 然后,在 CI 根目录下新建立一个配置文件,命名为 ...

  10. 多文档自己主动文摘:Multi-Document Summarization,MDS