概念:

  贝叶斯定理:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名。通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的;然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述

  朴素贝叶斯:朴素贝叶斯方法是基于贝叶斯定理和特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率(Maximum A Posteriori)最大的输出y。

通俗的来讲,在给定数据集的前提下,对于一个新样本(未分类),在数据集中找到和新样本特征相同的样本,最后根据这些样本算出每个类的概率,概率最高的类即为新样本的类。

运算公式:

P( h | d) = P ( d | h ) * P( h) / P(d)

这里:
P ( h | d ):是因子h基于数据d的假设概率,叫做后验概率
P ( d | h ) : 是假设h为真条件下的数据d的概率
P( h) : 是假设条件h为真的时候的概率(和数据无关),它叫做h的先验概率
P(d) : 数据d的概率,和先验条件无关.

算法实现分解:

1 数据处理:加载数据并把他们分成训练数据和测试数据
2 汇总数据:汇总训练数据的概率以便后续计算概率和做预测
3 结果预测: 通过给定的测试数据和汇总的训练数据做预测
4 评估准确性:使用测试数据来评估预测的准确性

代码实现:

  1. # Example of Naive Bayes implemented from Scratch in Python
  2. import csv
  3. import random
  4. import math
  5.  
  6. def loadCsv(filename):
  7. lines = csv.reader(open(filename, "rb"))
  8. dataset = list(lines)
  9. for i in range(len(dataset)):
  10. dataset[i] = [float(x) for x in dataset[i]]
  11. return dataset
  12.  
  13. def splitDataset(dataset, splitRatio):
  14. trainSize = int(len(dataset) * splitRatio)
  15. trainSet = []
  16. copy = list(dataset)
  17. while len(trainSet) < trainSize:
  18. index = random.randrange(len(copy))
  19. trainSet.append(copy.pop(index))
  20. return [trainSet, copy]
  21.  
  22. def separateByClass(dataset):
  23. separated = {}
  24. for i in range(len(dataset)):
  25. vector = dataset[i]
  26. if (vector[-1] not in separated):
  27. separated[vector[-1]] = []
  28. separated[vector[-1]].append(vector)
  29. return separated
  30.  
  31. def mean(numbers):
  32. return sum(numbers)/float(len(numbers))
  33.  
  34. def stdev(numbers):
  35. avg = mean(numbers)
  36. variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1)
  37. return math.sqrt(variance)
  38.  
  39. def summarize(dataset):
  40. summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)]
  41. del summaries[-1]
  42. return summaries
  43.  
  44. def summarizeByClass(dataset):
  45. separated = separateByClass(dataset)
  46. summaries = {}
  47. for classValue, instances in separated.iteritems():
  48. summaries[classValue] = summarize(instances)
  49. return summaries
  50.  
  51. def calculateProbability(x, mean, stdev):
  52. exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
  53. return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
  54.  
  55. def calculateClassProbabilities(summaries, inputVector):
  56. probabilities = {}
  57. for classValue, classSummaries in summaries.iteritems():
  58. probabilities[classValue] = 1
  59. for i in range(len(classSummaries)):
  60. mean, stdev = classSummaries[i]
  61. x = inputVector[i]
  62. probabilities[classValue] *= calculateProbability(x, mean, stdev)
  63. return probabilities
  64.  
  65. def predict(summaries, inputVector):
  66. probabilities = calculateClassProbabilities(summaries, inputVector)
  67. bestLabel, bestProb = None, -1
  68. for classValue, probability in probabilities.iteritems():
  69. if bestLabel is None or probability > bestProb:
  70. bestProb = probability
  71. bestLabel = classValue
  72. return bestLabel
  73.  
  74. def getPredictions(summaries, testSet):
  75. predictions = []
  76. for i in range(len(testSet)):
  77. result = predict(summaries, testSet[i])
  78. predictions.append(result)
  79. return predictions
  80.  
  81. def getAccuracy(testSet, predictions):
  82. correct = 0
  83. for i in range(len(testSet)):
  84. if testSet[i][-1] == predictions[i]:
  85. correct += 1
  86. return (correct/float(len(testSet))) * 100.0
  87.  
  88. def main():
  89. filename = 'pima-indians-diabetes.data.csv'
  90. splitRatio = 0.67
  91. dataset = loadCsv(filename)
  92. trainingSet, testSet = splitDataset(dataset, splitRatio)
  93. print('Split {0} rows into train={1} and test={2} rows').format(len(dataset), len(trainingSet), len(testSet))
  94. # prepare model
  95. summaries = summarizeByClass(trainingSet)
  96. # test model
  97. predictions = getPredictions(summaries, testSet)
  98. accuracy = getAccuracy(testSet, predictions)
  99. print('Accuracy: {0}%').format(accuracy)
  100.  
  101. main()

pima-indians-diabetes.data.csv的下载地址:

https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv

参考文档:

1 https://en.wikipedia.org/wiki/Naive_Bayes_classifier

2 https://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

3 https://machinelearningmastery.com/naive-bayes-for-machine-learning/

朴素贝叶斯算法简介及python代码实现分析的更多相关文章

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

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

  2. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

  3. 朴素贝叶斯算法的python实现方法

    朴素贝叶斯算法的python实现方法 本文实例讲述了朴素贝叶斯算法的python实现方法.分享给大家供大家参考.具体实现方法如下: 朴素贝叶斯算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类 ...

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

    http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现  鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) ...

  5. 机器学习:python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实 ...

  6. 朴素贝叶斯算法--python实现

    朴素贝叶斯算法要理解一下基础:    [朴素:特征条件独立   贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.]   极大似然估计 ...

  7. 朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  8. 机器学习---用python实现朴素贝叶斯算法(Machine Learning Naive Bayes Algorithm Application)

    在<机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)>一文中,我们介绍了朴素贝叶斯分类器的原理.现在,让我们来实践一下. 在 ...

  9. 朴素贝叶斯算法的python实现

    朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么 ...

随机推荐

  1. Mad Libs游戏

    一. 简单的输入输出 输入代码 name1=input('请输入姓名:') name2=input('请输入一个句子:') name3=input('请输入一个地点:') name4=input('请 ...

  2. python基础之Day21

    对象整合了操作数据的方法 1.init方法 调用类时自动触发,为对象初始化自己独有的特征 class people: def __init__(self,name,age,sex): self.nam ...

  3. 腾讯开源项目phxpaxos的编译步骤

    #paxos的一般编译流程在项目文档<中文详细编译手册>里面已经有介绍,这里重点介绍一下编译samples目录下的代码: #我的环境是ubuntu; #设置paxos根目录 phx_dir ...

  4. [C#.net]获取文本文件的编码,自动区分GB2312和UTF8

    昨天生产突然反馈上传的结果查询出现了乱码,我赶紧打开后台数据库,发现果真有数据变成了乱码.这个上传程序都运行3个多月了,从未发生乱码现象,查看程序的运行日志,发现日志里的中文都变成了乱码,然后对比之前 ...

  5. resin4配置之一个resin下多个app的正确配置方法

    可能是因为resin4出来不久的原因,很多人对一个resin配置多个app不是很了解,经过几个小时的研究,有了一些小的成果,在此分享一下: 在开发的时候很多人习惯了一个resin下配置多个app,习惯 ...

  6. Git的安装和使用

    在CentOS 6.x/7.x上安装git及最新版 方式一.yum安装 # yum install git 通过yum方式安装,版本比较旧,CentOS6.5上安装好是1.7.1版.如果想安装最新版或 ...

  7. linux下部署tomcat 上线jpress博客系统

    tomcat Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器. tomcat有三个端口 开始部署 安装tomcat 第一步:下载tomcat 安装包 tomcat官网 ...

  8. xml文档格式学习笔记

    xml入门经典 (pdf书籍) https://www.cnblogs.com/zhaopengcheng/p/6848802.html

  9. 浅谈Spring中的IOC容器

    一.IOC.DI基本概念 IoC(Inversion of Control)控制反转指的是把对象的创建,初始化,销毁等工作交给容器来做.由容器控制对象的生命周期(传统方式中是由我们程序员主动创建对象. ...

  10. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件

    对页面引用自定义控件后,通过绑定自定义事件,页面绑定子控件的事件,在子控件做了某些修改动作后,如何同步操作父页面的方法:下面我煮了个栗子,同学们可以来尝一尝试一试 a.aspx 引用 UserCont ...