• 简介

Naive Bayesian算法 也叫朴素贝叶斯算法(或者称为傻瓜式贝叶斯分类)

朴素(傻瓜):特征条件独立假设

贝叶斯:基于贝叶斯定理

这个算法确实十分朴素(傻瓜),属于监督学习,它是一个常用于寻找决策面的算法。

  • 基本思想

(1)病人分类举例

有六个病人 他们的情况如下:

症状 职业 病名
打喷嚏 护士 感冒
打喷嚏 农夫 过敏
头痛 建筑工人 脑震荡
头痛 建筑工人 感冒
打喷嚏 教师 感冒
头痛 教师 脑震荡

根据这张表 如果来了第七个病人 他是一个 打喷嚏 的 建筑工人

那么他患上感冒的概率是多少

根据贝叶斯定理:

  1. P(A|B) = P(B|A) P(A) / P(B)

可以得到:

  1. P(感冒|打喷嚏x建筑工人) = P(打喷嚏x建筑工人|感冒) x P(感冒) / P(打喷嚏x建筑工人)

假定 感冒 与 打喷嚏 相互独立 那么上面的等式变为:

  1. P(感冒|打喷嚏x建筑工人) = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒) / P(打喷嚏) x P(建筑工人)
    P(感冒|打喷嚏x建筑工人) = 2/3 x 1/3 x 1/2 /( 1/2 x 1/3 )= 2/3

因此 这位打喷嚏的建筑工人 患上感冒的概率大约是66%

(2)朴素贝叶斯分类器公式

假设某个体有n项特征,分别为F1、F2、…、Fn。现有m个类别,分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值:

  1. P(C|F1 x F2 ...Fn) = P(F1 x F2 ... Fn|C) x P(C) / P(F1 x F2 ... Fn)

由于 P(F1xF2 … Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求

  1. P(F1 x F2 ... Fn|C)P(C)

的最大值

根据朴素贝叶斯的朴素特点(特征条件独立假设),因此:

  1. P(F1 x F2 ... Fn|C)P(C) = P(F1|C) x P(F2|C) ... P(Fn|C)P(C)

上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。

  • 代码实现

环境:MacOS mojave  10.14.3

Python  3.7.0

使用库:scikit-learn    0.19.2

在终端输入下面的代码安装sklearn

  1. pip install sklearn

sklearn库官方文档http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

  1. >>> import numpy as np
  2. >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
  3. >>> Y = np.array([1, 1, 1, 2, 2, 2])
  4. #生成六个训练点,其中前三个属于标签(分类)1 后三个属于标签(分类)2
  5. >>> from sklearn.naive_bayes import GaussianNB
  6. #导入外部模块
  7. >>> clf = GaussianNB()#创建高斯分类器,把GaussianNB赋值给clf(分类器)
  8. >>> clf.fit(X, Y)#开始训练
  9. #它会学习各种模式,然后就形成了我们刚刚创建的分类器(clf)
  10. #我们在分类器上调用fit函数,接下来将两个参数传递给fit函数,一个是特征x 一个是标签y#最后我们让已经完成了训练的分类器进行一些预测,我们为它提供一个新点[-0.8,-1]
  11. >>> print(clf.predict([[-0.8, -1]]))
  12. [1]

上面的流程为:创建训练点->创建分类器->进行训练->对新的数据进行分类

上面的新的数据属于标签(分类)2

  • 绘制决策面

对于给定的一副散点图,其中蓝色是慢速区 红色是快速区,如何画出一条线 将点分开

perp_terrain_data.py

生成训练点

  1. import random
  2.  
  3. def makeTerrainData(n_points=1000):
  4. ###############################################################################
  5. ### make the toy dataset
  6. random.seed(42)
  7. grade = [random.random() for ii in range(0,n_points)]
  8. bumpy = [random.random() for ii in range(0,n_points)]
  9. error = [random.random() for ii in range(0,n_points)]
  10. y = [round(grade[ii]*bumpy[ii]+0.3+0.1*error[ii]) for ii in range(0,n_points)]
  11. for ii in range(0, len(y)):
  12. if grade[ii]>0.8 or bumpy[ii]>0.8:
  13. y[ii] = 1.0
  14.  
  15. ### split into train/test sets
  16. X = [[gg, ss] for gg, ss in zip(grade, bumpy)]
  17. split = int(0.75*n_points)
  18. X_train = X[0:split]
  19. X_test = X[split:]
  20. y_train = y[0:split]
  21. y_test = y[split:]
  22.  
  23. grade_sig = [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]==0]
  24. bumpy_sig = [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]==0]
  25. grade_bkg = [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]==1]
  26. bumpy_bkg = [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]==1]
  27.  
  28. # training_data = {"fast":{"grade":grade_sig, "bumpiness":bumpy_sig}
  29. # , "slow":{"grade":grade_bkg, "bumpiness":bumpy_bkg}}
  30.  
  31. grade_sig = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==0]
  32. bumpy_sig = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==0]
  33. grade_bkg = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==1]
  34. bumpy_bkg = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==1]
  35.  
  36. test_data = {"fast":{"grade":grade_sig, "bumpiness":bumpy_sig}
  37. , "slow":{"grade":grade_bkg, "bumpiness":bumpy_bkg}}
  38.  
  39. return X_train, y_train, X_test, y_test
  40. # return training_data, test_data

ClassifyNB.py

高斯分类

  1. def classify(features_train, labels_train):
  2. ### import the sklearn module for GaussianNB
  3. ### create classifier
  4. ### fit the classifier on the training features and labels
  5. ### return the fit classifier
  6.  
  7. from sklearn.naive_bayes import GaussianNB
  8. clf = GaussianNB()
  9. clf.fit(features_train, labels_train)
  10. return clf
  11. pred = clf.predict(features_test)

class_vis.py

绘图与保存图像

  1. import warnings
  2. warnings.filterwarnings("ignore")
  3.  
  4. import matplotlib
  5. matplotlib.use('agg')
  6.  
  7. import matplotlib.pyplot as plt
  8. import pylab as pl
  9. import numpy as np
  10.  
  11. #import numpy as np
  12. #import matplotlib.pyplot as plt
  13. #plt.ioff()
  14.  
  15. def prettyPicture(clf, X_test, y_test):
  16. x_min = 0.0; x_max = 1.0
  17. y_min = 0.0; y_max = 1.0
  18.  
  19. # Plot the decision boundary. For that, we will assign a color to each
  20. # point in the mesh [x_min, m_max]x[y_min, y_max].
  21. h = .01 # step size in the mesh
  22. xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
  23. Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
  24.  
  25. # Put the result into a color plot
  26. Z = Z.reshape(xx.shape)
  27. plt.xlim(xx.min(), xx.max())
  28. plt.ylim(yy.min(), yy.max())
  29.  
  30. plt.pcolormesh(xx, yy, Z, cmap=pl.cm.seismic)
  31.  
  32. # Plot also the test points
  33. grade_sig = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==0]
  34. bumpy_sig = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==0]
  35. grade_bkg = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==1]
  36. bumpy_bkg = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==1]
  37.  
  38. plt.scatter(grade_sig, bumpy_sig, color = "b", label="fast")
  39. plt.scatter(grade_bkg, bumpy_bkg, color = "r", label="slow")
  40. plt.legend()
  41. plt.xlabel("bumpiness")
  42. plt.ylabel("grade")
  43.  
  44. plt.savefig("test.png")

Main.py

主程序

  1. from prep_terrain_data import makeTerrainData
  2. from class_vis import prettyPicture
  3. from ClassifyNB import classify
  4.  
  5. import numpy as np
  6. import pylab as pl
  7.  
  8. features_train, labels_train, features_test, labels_test = makeTerrainData()
  9.  
  10. ### the training data (features_train, labels_train) have both "fast" and "slow" points mixed
  11. ### in together--separate them so we can give them different colors in the scatterplot,
  12. ### and visually identify them
  13. grade_fast = [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii]==0]
  14. bumpy_fast = [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii]==0]
  15. grade_slow = [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii]==1]
  16. bumpy_slow = [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii]==1]
  17.  
  18. clf = classify(features_train, labels_train)
  19.  
  20. ### draw the decision boundary with the text points overlaid
  21. prettyPicture(clf, features_test, labels_test)

运行得到分类完成图像:

可以看到并不是所有的点都正确分类了,还有一小部分点被错误分类了

计算分类正确率:

accuracy.py

  1. from class_vis import prettyPicture
  2. from prep_terrain_data import makeTerrainData
  3. from classify import NBAccuracy
  4.  
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. import pylab as pl
  8.  
  9. features_train, labels_train, features_test, labels_test = makeTerrainData()
  10.  
  11. def submitAccuracy():
  12. accuracy = NBAccuracy(features_train, labels_train, features_test, labels_test)
  13. return accuracy

在主程序Main结尾加入一段:

  1. from studentCode import submitAccuracy
  2. print(submitAccuracy())

得到正确率:0.884

  • 朴素贝叶斯的优势与劣势

优点:1、非常易于执行  2、它的特征空间非常大  3、运行非常容易、非常有效

缺点:它会与间断、由多个单词组成且意义明显不同的词语不太适合(eg:芝加哥公牛)

朴素贝叶斯(Naive Bayesian)的更多相关文章

  1. 朴素贝叶斯 Naive Bayes

    2017-12-15 19:08:50 朴素贝叶斯分类器是一种典型的监督学习的算法,其英文是Naive Bayes.所谓Naive,就是天真的意思,当然这里翻译为朴素显得更学术化. 其核心思想就是利用 ...

  2. 机器学习算法实践:朴素贝叶斯 (Naive Bayes)(转载)

    前言 上一篇<机器学习算法实践:决策树 (Decision Tree)>总结了决策树的实现,本文中我将一步步实现一个朴素贝叶斯分类器,并采用SMS垃圾短信语料库中的数据进行模型训练,对垃圾 ...

  3. 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)

    目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...

  4. NLP系列(2)_用朴素贝叶斯进行文本分类(上)

    作者:龙心尘 && 寒小阳 时间:2016年1月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50597149 h ...

  5. 【Udacity】朴素贝叶斯

    机器学习就像酿制葡萄酒--好的葡萄(数据)+好的酿酒方法(机器学习算法) 监督分类 supervised classification Features -->Labels 保留10%的数据作为 ...

  6. [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

    [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...

  7. 后端程序员之路 18、朴素贝叶斯模型(Naive Bayesian Model,NBM)

    贝叶斯推断及其互联网应用(一):定理简介 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.ht ...

  8. [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)

    Naive Bayes-朴素贝叶斯 Bayes' theorem(贝叶斯法则) 在概率论和统计学中,Bayes' theorem(贝叶斯法则)根据事件的先验知识描述事件的概率.贝叶斯法则表达式如下所示 ...

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

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

随机推荐

  1. MEAN框架学习笔记

    MEAN框架学习笔记 MEAN开发框架的资料非常少.基本的资料还是来自于learn.mean.io站点上的介绍. 于是抱着一种零基础学习的心态,在了解的过程中,通过翻译加上理解将MEAN框架一点点消化 ...

  2. csu 1030: 素数槽

     素数槽 Description 处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽.比如,‹24, 25, 26, 27, 28›是处于素数23 ...

  3. ZOJ2588 Burning Bridges 无向图的割边

    题目大意:求无向图的割边编号. 割边定义:在一个连通图中,如果删去一个边e,图便变成不连通的两个部分,则e为该图的割边. 求法:边(u,v) 不是割边,当且仅当边(u,v)在一个环内.因此所有不在环内 ...

  4. 理解和配置 Linux 下的 OOM Killer【转】

    本文转载自:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉 ...

  5. 用虚拟机创建win7 32位系统来测试win 7 64位系统无法安装cad 2004 缺少acdb16.dll的问题

  6. Python环境设置-zlib not available

    今天在Linux中安Python3的时候,出现了一个错误:zipimport.ZipImportError: can‘t decompress data; zlib not available 网上找 ...

  7. PLSQL简介

    目录 什么是PLSQL PLSQL起源 PLSQL早期版本 改善可移植性 改进执行权限于事务的完整性 原书:steven feuerstei-oracle PLSQL grogramming 2014 ...

  8. IO流读取文件内容时,出现空格的问题(未找到原因)

    import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOExceptio ...

  9. C++程序开发的基本过程

    前两天说去一家小公司实习,被他们的一个技术员工的一个问题问到了,问的我当时都没有反应过来,回来后突然发现这个问题我会啊 ,只是当时没想到这么浅显.现在总结下: C++程序开发的基本过程: 1)编辑 开 ...

  10. 使用Micrisoft.net设计方案 第三章Web表示模式

    第三章Web表示模式 体系结构设计者在设计第一个作品时比较精简和干练.在第一次设计时,并清除自己做什么,因此比较小心谨慎.第二个作品是最危险的一个作品,此时他会对第一个作品做修饰和润色,以及把第一次设 ...