设为首页 收藏本站
查看: 901|回复: 0

[经验分享] 朴素贝叶斯算法的Python实现

[复制链接]

尚未签到

发表于 2018-8-12 08:02:20 | 显示全部楼层 |阅读模式
# 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.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)
  dictPara.append(a)
  dictPara.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[item][sample]
  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']

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550377-1-1.html 上篇帖子: Python base64 和图片相互转换 下篇帖子: python BeautifulSoup获取 网页链接的文字内容
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表