朴素贝叶斯算法的Python实现

注意:1、代码中的注释请不要放在源程序中运行,会报错。

2、代码中的数据集来源于http://archive.ics.uci.edu/ml/datasets/Car+Evaluation

3、对于朴素贝叶斯的原理,可以查看我的前面的博客

# Author :Wenxiang Cui
# Date :2015/9/11
# Function: A classifier which using naive Bayesian algorithm 

import math

class Bayesian:
	def __init__(self):
		self.dataS = [] # 训练样本集DataSource
		self.attriList = [] # 属性集合
		self.desClass = 0 # 分类目标属性在attriList中的位置
	def loadDataS(self,fileName,decollator):
		#input: 
		#		fileName - DataSource 的文件名
		#		decollator - DataSource 中每个字段之间的分割符,有可能是空格或‘,‘
		#function : 
		#		从磁盘中读取数据并转化为较好处理的列表
		items = []
		fp = open(filename,‘r‘)
		lines = fp.readlines()
		for line in lines:
			line = line.strip(‘\n‘)
			items.append(line)
		fp.close()

		i = 0
		b = []
		for i in range(len(items)):
			b.append(items[i].split(decollator))
		self.dataS = b[:]
	def getAttriList(self,attributes):
		#input: 
		#		attributes - 训练数据集中的属性集合,必须与dataSource中的列相对应
		#function: 
		#		获得训练数据集的属性列表
		self.attriList = attributes[:]
	def getDesClass(self,loca):
		#input: 
		#		loca - 分类目标属性在attriList中的位置
		#function: 
		#		获得分类目标属性在attriList中的位置
		self.desClass = loca
	def calPriorProb(self):
		#input: 
		#
		#function: 
		#		计算类的先验概率
		dictFreq = {} # 构建频度表,用字典表示
		desLabel = [] 
		sampleNum = 0
		for items  in self.dataS:
			sampleNum += 1
			if not items[self.desClass] in dictFreq:
				dictFreq[items[self.desClass]] = 1
				desLabel.append(items[self.desClass])
			else:
				dictFreq[items[self.desClass]] += 1
		dictPriorP = {} # 构建先验概率表,用字典表示
		for item in desLabel:
			dictPriorP[item] = float(dictFreq[item]) / sampleNum
		self.PriorP = dictPriorP[:]
		self.classLabel = desLabel[:]
	def calProb(self,type,loca):
		#input: 
		#		type - 定义属性是连续的还是离散的
		#   	loca - 该属性在属性集中的位置
		#output:
		#		dictPara - 连续属性的样本均值和方差(列表表示)
		#		dictProb - 离散属性的类条件概率
		#function: 
		#		计算某个属性的类条件概率密度
		if type == ‘continuous‘: 
			dictData = [] # 提取出样本的类别和当前属性值
			dictPara = [] # 记录样本的类别和其对应的样本均值和方差
			for item in self.classLabel:
				dictData.append([])
				dictPara.append([])
			for items in self.dataS:
				dataIndex = self.classLabel.index(items[self.desLabel]) # 返回当前样本类属性
				dictData[dataIndex].append(float(items[loca])) # 记录当前属性值及该样本的类属性
			#计算类属性的样本均值和方差(可以用Numpy包来快速处理)
			for i in range(len(self.classLabel)):
				[a,b] = self.calParam(dictData[i])
				dictPara[i].append(a)
				dictPara[i].append(b)
			return dictPara
		elif type == ‘discrete‘: 
			dictFreq = {}
			dictProb = {}
			for item in self.classLabel:# 构建频度表,用字典表示
				dictFreq[item] = {}
				dictProb[item] = {}
			label = []
			for items in self.dataS:
				if not items[loca] in label:
					label.append(items[loca])
					dictFreq[items[self.desClass]][items[loca]] = 1
				else:
					dictFreq[items[self.desClass]][items[loca]] += 1
			needLaplace = 0
			for key in dictFreq.keys():
				for ch in labels:
					if ch not in dictFreq[key]:
						dictFreq[key][ch] = 0
						needLaplace = 1
				if needLaplace == 1: # 拉普拉斯平滑用于处理类条件概率为0的情况
					dictFreq[key] = self.LaplaceEstimator(dictFreq[key])
					needLaplace = 0
			for item in self.classLabel:
				for ch in dictFreq[item]:
					dictProb[item][ch] = float(dictFreq[item][ch]) / self.dictFreq[item]
			return dictProb
		else:
			print ‘Wrong type!‘
	def calParam(self,souList):
		#input: 
		#		souList - 待计算的列表
		#output:
		#		meanVal - 列表元素的均值
		# 		deviation - 列表元素的标准差
		#function: 
		#		计算某个属性的类条件概率密度
		meanVal = sum(souList) / float(len(souList))
		deviation = 0
		tempt = 0
		for val in souList:
			tempt += (val - meanVal)**2
		deviation = math.sqrt(float(tempt)/(len(souList)-1))
		return meanVal,deviation
	def LaplaceEstimator(self,souDict):
		#input: 
		#		souDict - 待计算的字典
		#output:
		#		desDict - 平滑后的字典
		#function: 
		#		拉普拉斯平滑
		desDict = souDict.copy()
		for key in souDict:
			desDict[key] = souDict[key] + 1
		return desDict

class CarBayesian(Bayesian):
	def __init__(self):
		Bayesian.__init__(self)
		self.buying = {}
		self.maint = {}
		self.doors = {}
		self.persons = {}
		self.lug_boot = {}
		self.safety = {}
	def tranning(self):
		self.Prob = []
		self.buying = Bayesian.calProb(‘discrete‘,0)
		self.maint = Bayesian.calProb(‘discrete‘,1)
		self.doors = Bayesian.calProb(‘discrete‘,2)
		self.persons = Bayesian.calProb(‘discrete‘,3)
		self.lug_boot = Bayesian.calProb(‘discrete‘,4)
		self.safety = Bayesian.calProb(‘discrete‘,5)

		self.Prob.append(self.buying)
		self.Prob.append(self.maint)
		self.Prob.append(self.doors)
		self.Prob.append(self.persons)
		self.Prob.append(self.lug_boot)
		self.Prob.append(self.safety)
	def classify(self,sample):
		#input :
		# 		sample - 一个样本
		#function:
		# 		判断输入的这个样本的类别
		posteriorProb = {}
		for item in self.classLabel:
				posteriorProb[item] = self.PriorP[item]
				for i in range(len(sample)-1):
					posteriorProb[item] *= self.Prob[i][item][sample[i]]
		maxVal = posteriorProb[self.classLabel[0]]
		i = 0
		for item in posteriorProb:
			i += 1
			if posteriorProb[item] > maxVal:
				maxVal = posteriorProb[item]
				location = i
		print "该样本属于的类别是:",self.classLabel[location]

filename = "D:\MyDocuments-HnH\DataMining\DataSets\Car\Car_Data.txt"
MyCar = CarBayesian()
MyCar.loadDataS(filename,‘,‘)
attributes = [‘buying‘,‘maint‘,‘doors‘,‘persons‘,‘lug_boot‘,‘safety‘]
MyCar.getAttriList(attributes)
MyCar.getDesClass(7-1)
MyCar.tranning()
sample = [‘vhigh‘,‘vhigh‘,‘2‘,‘2‘,‘small‘,‘low‘]
时间: 2025-01-01 17:43:38

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

朴素贝叶斯算法的python实现 -- 机器学习实战

1 import numpy as np 2 import re 3 4 #词表到向量的转换函数 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], 7 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], 8 ['my', 'dalmation', 'is', 'so', 'cu

朴素贝叶斯算法及实现

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属于

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

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

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

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

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

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

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

转载请注明出处: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-近

机器学习-朴素贝叶斯原理及Python实现

机器学习-朴素贝叶斯原理及Python实现 贝叶斯公式 P(A|B) = (P(B|A)P(A))/P(B) 举例:苹果10个,有2个黄色:梨10个,有6个黄色,求拿出一个黄色水果,是苹果的概率. 代入公式: P(苹果|黄色) = (P(黄色|苹果)P(苹果))/P(黄色) P(黄色) = (2+6)/20 = 2/5 P(苹果) = 10/20 = 1/2 = 0.5 P(黄色|苹果)=1/5 P(黄色|苹果)P(苹果) = P(黄色,苹果) = 1/5*1/2 = 1/10 = 0.1 P(