朴素贝叶斯算法简介及python代码实现分析

概念:

  贝叶斯定理:贝叶斯理论是以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/

原文地址:https://www.cnblogs.com/dylancao/p/9761788.html

时间: 2024-10-16 23:11:51

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

利用朴素贝叶斯算法进行分类-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

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

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

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

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

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

基于概率论的分类方法:朴素贝叶斯算法实践学习

      关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月12日 13:03:46所撰写内容(http://blog.csdn.net/qq_37608890/article/details/78738552).             本文根据最近学习机器学习书籍 网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过.          通过前两篇文章,我们对于k-近

朴素贝叶斯算法及实现

1.朴素贝叶斯算法介绍 一个待分类项x=(a,b,c...),判断x属于y1,y2,y3...类别中的哪一类. 贝叶斯公式: 算法定义如下: (1).设x={a1, a2, a3, ...}为一个待分类项,而a1, a2, a3...分别为x的特征 (2).有类别集合C={y1, y2,  y3,  ..} (3).计算p(y1|x), p(y2|x), p(y3|x), .... (4).如果p(y(k)|x)=max{p(y1|x), p(y2|x), p(y3|x), ....},则x属于

数据挖掘|朴素贝叶斯算法

作者:张一 链接:https://zhuanlan.zhihu.com/p/21571692 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 因为后期的项目将涉及到各种各样的价格数据处理问题,所以我们现在开始学习一些简单的数据清洗与算法的知识.关于算法,以前听起来觉得好高大上,现在开始学,觉得书上的描述并不是很通俗易懂,所以用自己的语言来简要写一下这些算法~ 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(ht

朴素贝叶斯算法原理及实现

朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一. 1.准备知识 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类. 这个定理解决了现实生活里经常遇到的问题:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A).这里先解释什么是条件概率: 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率.其基本求解公式为:. 下面不加证明地直接给出贝叶斯定理: 2.朴素贝叶斯分类 2.1

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

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