朴素贝叶斯的学习与分类

乍看起来似乎是要求一个概率,还要先得到额外三个概率,有用么?其实这个简单的公式非常贴切人类推理的逻辑,即通过可以观测的数据,推测不可观测的数据。举个例子,也许你在办公室内不知道外面天气是晴天雨天,但是你观测到有同事带了雨伞,那么可以推断外面八成在下雨。

若X 是要输入的随机变量,则Y 是要输出的目标类别。对X 进行分类,即使求的使P(Y|X) ***的Y值。若X 为n 维特征变量 X = {A1, A2, …..An} ,若输出类别集合为Y = {C1, C2, …. Cm} 。

X 所属最有可能类别 y = argmax P(Y|X), 进行如下推导:

朴素贝叶斯的学习

有公式可知,欲求分类结果,须知如下变量:

各个类别的条件概率,

输入随机变量的特质值的条件概率

示例代码:

 
 
 
 
  1. import copy 
  2.  
  3. class native_bayes_t: 
  4.      
  5.     def __init__(self, character_vec_, class_vec_): 
  6.         """ 
  7.         构造的时候需要传入特征向量的值,以数组方式传入 
  8.         参数1 character_vec_ 格式为 [("character_name",["","",""])] 
  9.         参数2 为包含所有类别的数组 格式为["class_X", "class_Y"] 
  10.         """ 
  11.         self.class_set = {} 
  12.         # 记录该类别下各个特征值的条件概率 
  13.         character_condition_per = {} 
  14.         for character_name in character_vec_: 
  15.             character_condition_per[character_name[0]]= {} 
  16.             for character_value in character_name[1]: 
  17.                 character_condition_per[character_name[0]][character_value] = { 
  18.                     'num'           : 0,  # 记录该类别下该特征值在训练样本中的数量, 
  19.                     'condition_per' : 0.0 # 记录该类别下各个特征值的条件概率 
  20.                 } 
  21.         for class_name in class_vec: 
  22.             self.class_set[class_name] = { 
  23.                 'num'                     : 0,  # 记录该类别在训练样本中的数量, 
  24.                 'class_per'               : 0.0, # 记录该类别在训练样本中的先验概率, 
  25.                 'character_condition_per' : copy.deepcopy(character_condition_per), 
  26.             } 
  27.  
  28.         #print("init", character_vec_, self.class_set) #for debug 
  29.  
  30.     def learn(self, sample_): 
  31.         """ 
  32.         learn 参数为训练的样本,格式为 
  33.         [ 
  34.             { 
  35.                 'character'  : {'character_A':'A1'}, #特征向量 
  36.                 'class_name' : 'class_X'             #类别名称 
  37.             } 
  38.         ] 
  39.         """ 
  40.         for each_sample in sample: 
  41.             character_vec  = each_sample['character'] 
  42.             class_name     = each_sample['class_name'] 
  43.  
  44.             data_for_class = self.class_set[class_name] 
  45.             data_for_class['num'] += 1 
  46.  
  47.             # 各个特质值数量加1 
  48.             for character_name in character_vec: 
  49.                 character_value = character_vec[character_name] 
  50.                 data_for_character = data_for_class['character_condition_per'][character_name][character_value] 
  51.  
  52.                 data_for_character['num'] += 1 
  53.  
  54.         # 数量计算完毕, 计算最终的概率值 
  55.         sample_num = len(sample) 
  56.         for each_sample in sample: 
  57.             character_vec = each_sample['character'] 
  58.             class_name    = each_sample['class_name'] 
  59.  
  60.             data_for_class = self.class_set[class_name] 
  61.             # 计算类别的先验概率 
  62.             data_for_class['class_per'] = float(data_for_class['num']) / sample_num 
  63.  
  64.             # 各个特质值的条件概率 
  65.             for character_name in character_vec: 
  66.                 character_value = character_vec[character_name] 
  67.                  
  68.                 data_for_character = data_for_class['character_condition_per'][character_name][character_value] 
  69.  
  70.                 data_for_character['condition_per'] = float(data_for_character['num']) / data_for_class['num'] 
  71.  
  72.         from pprint import pprint 
  73.         pprint(self.class_set)  #for debug 
  74.  
  75.     def classify(self, input_): 
  76.         """ 
  77.             对输入进行分类,输入input的格式为 
  78.         { 
  79.             "character_A":"A1", 
  80.             "character_B":"B3", 
  81.         } 
  82.         """ 
  83.         best_class = '' 
  84.         max_per    = 0.0 
  85.         for class_name in self.class_set: 
  86.             class_data = self.class_set[class_name] 
  87.             per = class_data['class_per'] 
  88.             # 计算各个特征值条件概率的乘积 
  89.             for character_name in input_: 
  90.                 character_per_data = class_data['character_condition_per'][character_name] 
  91.                 per = per * character_per_data[input_[character_name]]['condition_per'] 
  92.             print(class_name, per) 
  93.             if per >= max_per: 
  94.                 best_class = class_name 
  95.  
  96.         return best_class 
  97.  
  98. character_vec = [("character_A",["A1","A2","A3"]), ("character_B",["B1","B2","B3"])] 
  99. class_vec     = ["class_X", "class_Y"] 
  100. bayes = native_bayes_t(character_vec, class_vec) 
  101.  
  102.  
  103. sample = [ 
  104.             { 
  105.                 'character'  : {'character_A':'A1', 'character_B':'B1'}, #特征向量 
  106.                 'class_name' : 'class_X'             #类别名称 
  107.             }, 
  108.             { 
  109.                 'character'  : {'character_A':'A3', 'character_B':'B1'}, #特征向量 
  110.                 'class_name' : 'class_X'             #类别名称 
  111.             }, 
  112.             { 
  113.                 'character'  : {'character_A':'A3', 'character_B':'B3'}, #特征向量 
  114.                 'class_name' : 'class_X'             #类别名称 
  115.             }, 
  116.             { 
  117.                 'character'  : {'character_A':'A2', 'character_B':'B2'}, #特征向量 
  118.                 'class_name' : 'class_X'             #类别名称 
  119.             }, 
  120.             { 
  121.                 'character'  : {'character_A':'A2', 'character_B':'B2'}, #特征向量 
  122.                 'class_name' : 'class_Y'             #类别名称 
  123.             }, 
  124.             { 
  125.                 'character'  : {'character_A':'A3', 'character_B':'B1'}, #特征向量 
  126.                 'class_name' : 'class_Y'             #类别名称 
  127.             }, 
  128.             { 
  129.                 'character'  : {'character_A':'A1', 'character_B':'B3'}, #特征向量 
  130.                 'class_name' : 'class_Y'             #类别名称 
  131.             }, 
  132.             { 
  133.                 'character'  : {'character_A':'A1', 'character_B':'B3'}, #特征向量 
  134.                 'class_name' : 'class_Y'             #类别名称 
  135.             }, 
  136.              
  137.         ] 
  138.  
  139. input_data ={ 
  140.     "character_A":"A1", 
  141.     "character_B":"B3", 
  142.  
  143. bayes.learn(sample) 
  144. print(bayes.classify(input_data)) 

总结:

朴素贝叶斯分类实现简单,预测的效率较高

朴素贝叶斯成立的假设是个特征向量各个属性条件独立,建模的时候需要特别注意

原文链接:http://www.cnblogs.com/zhiranok/archive/2012/09/22/native_bayes.html

【编辑推荐】

  1. 趣图三幅:负载均衡算法需要改进
  2. 程序员的艺术:排序算法舞蹈
  3. 为什么我反对纯算法面试题
  4. 赵劼:我看面试时出(纯)算法题
  5. 海量数据的二度人脉挖掘算法(Hadoop 实现)

本文题目:朴素贝叶斯的学习与分类
标题路径:http://www.gawzjz.com/qtweb2/news48/14198.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联