朴素贝叶斯的学习与分类

开发 开发工具
朴素贝叶斯基于贝叶斯定理,它假设输入随机变量的特征值是条件独立的,故称之为“朴素”。简单介绍贝叶斯定理。

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

若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

【编辑推荐】

责任编辑:彭凡 来源: 博客园
相关推荐

2017-07-24 10:36:37

Python机器学习朴素贝叶斯

2017-03-29 14:50:18

2021-04-18 09:57:45

Java朴素贝叶斯贝叶斯定理

2017-07-12 11:27:05

朴素贝叶斯情感分析Python

2021-07-29 13:06:29

Python机器学习编程语言

2021-08-30 11:53:36

机器学习人工智能计算机

2022-01-03 20:18:37

定理应用贝叶斯

2023-01-31 15:49:51

机器学习函数评分函数

2013-05-08 09:05:48

狐狸贝叶斯大数据

2017-11-07 11:17:40

朴素贝叶斯画像数据数据挖掘

2017-08-07 13:02:32

全栈必备贝叶斯

2018-09-13 12:51:58

数据挖掘算法朴素贝叶斯

2017-06-12 06:31:55

深度学习贝叶斯算法

2023-11-28 12:08:56

机器学习算法人工智能

2021-07-23 11:48:16

深度学习医疗人工智能

2020-10-19 12:55:59

机器学习技术人工智能

2020-05-21 14:50:37

算法深度学习人工智能

2016-08-30 00:19:30

2024-10-11 16:53:16

贝叶斯人工智能网络

2016-08-30 00:14:09

大数据贝叶斯
点赞
收藏

51CTO技术栈公众号