您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python如何實(shí)現(xiàn)樸素貝葉斯,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
概念簡(jiǎn)介:
樸素貝葉斯基于貝葉斯定理,它假設(shè)輸入隨機(jī)變量的特征值是條件獨(dú)立的,故稱之為“樸素”。簡(jiǎn)單介紹貝葉斯定理:
乍看起來(lái)似乎是要求一個(gè)概率,還要先得到額外三個(gè)概率,有用么?其實(shí)這個(gè)簡(jiǎn)單的公式非常貼切人類推理的邏輯,即通過(guò)可以觀測(cè)的數(shù)據(jù),推測(cè)不可觀測(cè)的數(shù)據(jù)。舉個(gè)例子,也許你在辦公室內(nèi)不知道外面天氣是晴天雨天,但是你觀測(cè)到有同事帶了雨傘,那么可以推斷外面八成在下雨。
若X 是要輸入的隨機(jī)變量,則Y 是要輸出的目標(biāo)類別。對(duì)X 進(jìn)行分類,即使求的使P(Y|X) 最大的Y值。若X 為n 維特征變量 X = {A1, A2, …..An} ,若輸出類別集合為Y = {C1, C2, …. Cm} 。
X 所屬最有可能類別 y = argmax P(Y|X), 進(jìn)行如下推導(dǎo):
樸素貝葉斯的學(xué)習(xí)
有公式可知,欲求分類結(jié)果,須知如下變量:
各個(gè)類別的條件概率,
輸入隨機(jī)變量的特質(zhì)值的條件概率
示例代碼:
import copy class native_bayes_t: def __init__(self, character_vec_, class_vec_): """ 構(gòu)造的時(shí)候需要傳入特征向量的值,以數(shù)組方式傳入 參數(shù)1 character_vec_ 格式為 [("character_name",["","",""])] 參數(shù)2 為包含所有類別的數(shù)組 格式為["class_X", "class_Y"] """ self.class_set = {} # 記錄該類別下各個(gè)特征值的條件概率 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, # 記錄該類別下該特征值在訓(xùn)練樣本中的數(shù)量, 'condition_per' : 0.0 # 記錄該類別下各個(gè)特征值的條件概率 } for class_name in class_vec: self.class_set[class_name] = { 'num' : 0, # 記錄該類別在訓(xùn)練樣本中的數(shù)量, 'class_per' : 0.0, # 記錄該類別在訓(xùn)練樣本中的先驗(yàn)概率, 'character_condition_per' : copy.deepcopy(character_condition_per), } #print("init", character_vec_, self.class_set) #for debug def learn(self, sample_): """ learn 參數(shù)為訓(xùn)練的樣本,格式為 [ { '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 # 各個(gè)特質(zhì)值數(shù)量加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 # 數(shù)量計(jì)算完畢, 計(jì)算最終的概率值 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] # 計(jì)算類別的先驗(yàn)概率 data_for_class['class_per'] = float(data_for_class['num']) / sample_num # 各個(gè)特質(zhì)值的條件概率 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_): """ 對(duì)輸入進(jìn)行分類,輸入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'] # 計(jì)算各個(gè)特征值條件概率的乘積 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))
關(guān)于“Python如何實(shí)現(xiàn)樸素貝葉斯”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。