您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python如何實現樸素貝葉斯,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
概念簡介:
樸素貝葉斯基于貝葉斯定理,它假設輸入隨機變量的特征值是條件獨立的,故稱之為“樸素”。簡單介紹貝葉斯定理:
乍看起來似乎是要求一個概率,還要先得到額外三個概率,有用么?其實這個簡單的公式非常貼切人類推理的邏輯,即通過可以觀測的數據,推測不可觀測的數據。舉個例子,也許你在辦公室內不知道外面天氣是晴天雨天,但是你觀測到有同事帶了雨傘,那么可以推斷外面八成在下雨。
若X 是要輸入的隨機變量,則Y 是要輸出的目標類別。對X 進行分類,即使求的使P(Y|X) 最大的Y值。若X 為n 維特征變量 X = {A1, A2, …..An} ,若輸出類別集合為Y = {C1, C2, …. Cm} 。
X 所屬最有可能類別 y = argmax P(Y|X), 進行如下推導:
樸素貝葉斯的學習
有公式可知,欲求分類結果,須知如下變量:
各個類別的條件概率,
輸入隨機變量的特質值的條件概率
示例代碼:
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如何實現樸素貝葉斯”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。