日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
樸素貝葉斯的學習與分類

乍看起來似乎是要求一個概率,還要先得到額外三個概率,有用么?其實這個簡單的公式非常貼切人類推理的邏輯,即通過可以觀測的數(shù)據(jù),推測不可觀測的數(shù)據(jù)。舉個例子,也許你在辦公室內(nèi)不知道外面天氣是晴天雨天,但是你觀測到有同事帶了雨傘,那么可以推斷外面八成在下雨。

若X 是要輸入的隨機變量,則Y 是要輸出的目標類別。對X 進行分類,即使求的使P(Y|X) ***的Y值。若X 為n 維特征變量 X = {A1, A2, …..An} ,若輸出類別集合為Y = {C1, C2, …. Cm} 。

X 所屬最有可能類別 y = argmax P(Y|X), 進行如下推導:

樸素貝葉斯的學習

有公式可知,欲求分類結果,須知如下變量:

各個類別的條件概率,

輸入隨機變量的特質(zhì)值的條件概率

示例代碼:

 
 
 
 
  1. import copy 
  2.  
  3. class native_bayes_t: 
  4.      
  5.     def __init__(self, character_vec_, class_vec_): 
  6.         """ 
  7.         構造的時候需要傳入特征向量的值,以數(shù)組方式傳入 
  8.         參數(shù)1 character_vec_ 格式為 [("character_name",["","",""])] 
  9.         參數(shù)2 為包含所有類別的數(shù)組 格式為["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,  # 記錄該類別下該特征值在訓練樣本中的數(shù)量, 
  19.                     'condition_per' : 0.0 # 記錄該類別下各個特征值的條件概率 
  20.                 } 
  21.         for class_name in class_vec: 
  22.             self.class_set[class_name] = { 
  23.                 'num'                     : 0,  # 記錄該類別在訓練樣本中的數(shù)量, 
  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 參數(shù)為訓練的樣本,格式為 
  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.             # 各個特質(zhì)值數(shù)量加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.         # 數(shù)量計算完畢, 計算最終的概率值 
  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.             # 各個特質(zhì)值的條件概率 
  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)) 

總結:

樸素貝葉斯分類實現(xiàn)簡單,預測的效率較高

樸素貝葉斯成立的假設是個特征向量各個屬性條件獨立,建模的時候需要特別注意

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

【編輯推薦】

  1. 趣圖三幅:負載均衡算法需要改進
  2. 程序員的藝術:排序算法舞蹈
  3. 為什么我反對純算法面試題
  4. 趙劼:我看面試時出(純)算法題
  5. 海量數(shù)據(jù)的二度人脈挖掘算法(Hadoop 實現(xiàn))

當前標題:樸素貝葉斯的學習與分類
本文鏈接:http://www.dlmjj.cn/article/dpjsjep.html