91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現樸素貝葉斯

發布時間:2021-04-06 10:52:51 來源:億速云 閱讀:149 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python如何實現樸素貝葉斯,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

 概念簡介:

樸素貝葉斯基于貝葉斯定理,它假設輸入隨機變量的特征值是條件獨立的,故稱之為“樸素”。簡單介紹貝葉斯定理:

Python如何實現樸素貝葉斯

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

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

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

Python如何實現樸素貝葉斯

樸素貝葉斯的學習

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

各個類別的條件概率,

Python如何實現樸素貝葉斯

輸入隨機變量的特質值的條件概率

Python如何實現樸素貝葉斯

示例代碼:

import copy

class native_bayes_t:
  
  def __init__(self, character_vec_, class_vec_):
    """
    構造的時候需要傳入特征向量的值,以數組方式傳入
    參數1 character_vec_ 格式為 [("character_name",["","",""])]
    參數2 為包含所有類別的數組 格式為["class_X", "class_Y"]
    """
    self.class_set = {}
    # 記錄該類別下各個特征值的條件概率
    character_condition_per = {}
    for character_name in character_vec_:
      character_condition_per[character_name[0]] = {}
      for character_value in character_name[1]:
        character_condition_per[character_name[0]][character_value] = {
          'num'      : 0, # 記錄該類別下該特征值在訓練樣本中的數量,
          'condition_per' : 0.0 # 記錄該類別下各個特征值的條件概率
        }
    for class_name in class_vec:
      self.class_set[class_name] = {
        'num'           : 0, # 記錄該類別在訓練樣本中的數量,
        'class_per'        : 0.0, # 記錄該類別在訓練樣本中的先驗概率,
        'character_condition_per' : copy.deepcopy(character_condition_per),
      }

    #print("init", character_vec_, self.class_set) #for debug

  def learn(self, sample_):
    """
    learn 參數為訓練的樣本,格式為
    [
      {
        'character' : {'character_A':'A1'}, #特征向量
        'class_name' : 'class_X'       #類別名稱
      }
    ]
    """
    for each_sample in sample:
      character_vec = each_sample['character']
      class_name   = each_sample['class_name']

      data_for_class = self.class_set[class_name]
      data_for_class['num'] += 1

      # 各個特質值數量加1
      for character_name in character_vec:
        character_value = character_vec[character_name]
        data_for_character = data_for_class['character_condition_per'][character_name][character_value]

        data_for_character['num'] += 1

    # 數量計算完畢, 計算最終的概率值
    sample_num = len(sample)
    for each_sample in sample:
      character_vec = each_sample['character']
      class_name  = each_sample['class_name']

      data_for_class = self.class_set[class_name]
      # 計算類別的先驗概率
      data_for_class['class_per'] = float(data_for_class['num']) / sample_num

      # 各個特質值的條件概率
      for character_name in character_vec:
        character_value = character_vec[character_name]
        
        data_for_character = data_for_class['character_condition_per'][character_name][character_value]

        data_for_character['condition_per'] = float(data_for_character['num']) / data_for_class['num']

    from pprint import pprint
    pprint(self.class_set) #for debug

  def classify(self, input_):
    """
      對輸入進行分類,輸入input的格式為
    {
      "character_A":"A1",
      "character_B":"B3",
    }
    """
    best_class = ''
    max_per  = 0.0
    for class_name in self.class_set:
      class_data = self.class_set[class_name]
      per = class_data['class_per']
      # 計算各個特征值條件概率的乘積
      for character_name in input_:
        character_per_data = class_data['character_condition_per'][character_name]
        per = per * character_per_data[input_[character_name]]['condition_per']
      print(class_name, per)
      if per >= max_per:
        best_class = class_name

    return best_class

character_vec = [("character_A",["A1","A2","A3"]), ("character_B",["B1","B2","B3"])]
class_vec   = ["class_X", "class_Y"]
bayes = native_bayes_t(character_vec, class_vec)


sample = [
      {
        'character' : {'character_A':'A1', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_X'       #類別名稱
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_X'       #類別名稱
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_X'       #類別名稱
      },
      {
        'character' : {'character_A':'A2', 'character_B':'B2'}, #特征向量
        'class_name' : 'class_X'       #類別名稱
      },
      {
        'character' : {'character_A':'A2', 'character_B':'B2'}, #特征向量
        'class_name' : 'class_Y'       #類別名稱
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_Y'       #類別名稱
      },
      {
        'character' : {'character_A':'A1', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_Y'       #類別名稱
      },
      {
        'character' : {'character_A':'A1', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_Y'       #類別名稱
      },
      
    ]

input_data ={
  "character_A":"A1",
  "character_B":"B3",
}

bayes.learn(sample)
print(bayes.classify(input_data))

關于“Python如何實現樸素貝葉斯”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元谋县| 浮梁县| 卢氏县| 仙居县| 湟中县| 田阳县| 嘉祥县| 沙河市| 澎湖县| 武隆县| 黄骅市| 蓬安县| 土默特左旗| 石城县| 崇礼县| 鹰潭市| 钟祥市| 宽甸| 兴城市| 沅陵县| 和顺县| 兖州市| 广平县| 成安县| 栾城县| 扶余县| 大悟县| 商南县| 镇远县| 吉首市| 仙居县| 金山区| 大同市| 柞水县| 广水市| 伊春市| 中卫市| 嘉禾县| 西城区| 江川县| 阿拉善盟|