分類與監督學習,樸素貝葉斯分類算法
阿新 • • 發佈:2018-11-18
相似性 else 引擎 之間 das 簡單的 貝葉斯分類算法 數據集 搜索引擎
1.理解分類與監督學習、聚類與無監督學習。 (1)簡述分類與聚類的聯系與區別。 聯系: ①聚類分析是研究如何在沒有訓練的條件下把樣本劃分為若幹類。 ②在分類中,對於目標數據庫中存在哪些類是知道的,要做的就是將每一條記錄分別屬於哪一類標記出來。 ③聚類需要解決的問題是將已給定的若幹無標記的模式聚集起來使之成為有意義的聚類,聚類是在預先不知道目標數據庫到底有多少類的情況下,希望將所有的記錄組成不同的聚類,並且使得在這種分類情況下,以某種度量(例如:距離)為標準的相似性,在同一聚類之間最小化,而在不同聚類之間最大化。 ④與分類不同,無監督學習不依賴預先定義的類或帶類標記的訓練實例,需要由聚類學習算法自動確定標記,而分類學習的實例或數據樣本有類別標記 區別:分類是事先定義好類別 ,類別數不變 。分類器需要由人工標註的分類訓練語料訓練得到,屬於有指導學習範疇。聚類則沒有事先預定的類別,類別數不確定。 聚類不需要人工標註和預先訓練分類器,類別在聚類過程中自動生成 。分類適合類別或分類體系已經確定的場合,比如按照國圖分類法分類圖書;聚類則適合不存在分類體系、類別數不確定的場合,一般作為某些應用的前端,比如多文檔文摘、搜索引擎結果後聚類(元搜索)等。 (2)簡述什麽是監督學習與無監督學習。 ① 監督學習:從給定的訓練數據集中學習出一個函數(模型參數),當新的數據到來時,可以根據這個函數預測結果。監督學習的訓練集要求包括輸入輸出,也可以說是特征和目標。訓練集中的目標是由人標註的。監督學習就是最常見的分類(註意和聚類區分)問題,通過已有的訓練樣本(即已知數據及其對應的輸出)去訓練得到一個最優模型(這個模型屬於某個函數的集合,最優表示某個評價準則下是最佳的),再利用這個模型將所有的輸入映射為相應的輸出,對輸出進行簡單的判斷從而實現分類的目的。也就具有了對未知數據分類的能力。監督學習的目標往往是讓計算機去學習我們已經創建好的分類系統(模型)。 監督學習是訓練神經網絡和決策樹的常見技術。這兩種技術高度依賴事先確定的分類系統給出的信息,對於神經網絡,分類系統利用信息判斷網絡的錯誤,然後不斷調整網絡參數。對於決策樹,分類系統用它來判斷哪些屬性提供了最多的信息。 常見的有監督學習算法:回歸分析和統計分類。最典型的算法是KNN和SVM。
2.樸素貝葉斯分類算法 實例 利用關於心臟病情患者的臨床數據集,建立樸素貝葉斯分類模型。 有六個分類變量(分類因子):性別,年齡、KILLP評分、飲酒、吸煙、住院天數 目標分類變量疾病:–心梗–不穩定性心絞痛 新的實例:–(性別=‘男’,年齡<70, KILLP=‘I’,飲酒=‘是’,吸煙≈‘是’,住院天數<7) 最可能是哪個疾病? 上傳演算過程。
3.編程實現樸素貝葉斯分類算法 利用訓練數據集,建立分類模型。 輸入待分類項,輸出分類結果。 可以心臟病情患者的臨床數據為例,但要對數據預處理。
import numpy as np import pandas data=pandas.read_excel(‘心臟病患者臨床數據.xlsx‘) data #對性別進行處理(男為0,女為1) xingbie=[] for i in data[‘性別‘]: if i ==‘男‘: xingbie.append(0) else: xingbie.append(1) #對年齡段進行預處理(<70為1,70-80為2,>80為3) ages=[] for j in data[‘年齡‘]: if j ==‘<70‘: ages.append(1) elif j ==‘70-80‘: ages.append(2) else: ages.append(3) #對住院天數進行處理(<70為1,7-14為2,>14為3) days=[] for k in data[‘住院天數‘]: if k==‘<7‘: days.append(1) elif k==‘7-14‘: days.append(2) else: days.append(3) #處理後的數據 data1=data data1[‘性別‘]=xingbie data1[‘年齡‘]=ages data1[‘住院天數‘]=days #將數據轉成數組 data_arr=np.array(data1) data_arr #利用貝葉斯算法對給定的組別進行分類 def NB(xingbie, ages, KILLP, drink, smoke, days): #初始化值 x1_y1,x2_y1,x3_y1,x4_y1,x5_y1,x6_y1 = 0,0,0,0,0,0 x1_y2,x2_y2,x3_y2,x4_y2,x5_y2,x6_y2 = 0,0,0,0,0,0 y1 = 0 y2 = 0 #計算為心梗的概率 for a in data_arr: if a[6]==‘心梗‘: y1+=1 if a[0]==xingbie: x1_y1+=1 if a[1]==ages: x2_y1+=1 if a[2]==KILLP: x3_y1+=1 if a[3]==drink: x4_y1+=1 if a[4]==smoke: x5_y1+=1 if a[5]==days: x6_y1+=1 else:#計算患有不穩定性心絞痛的概率 y2+=1 if a[0]==xingbie: x1_y2+=1 if a[1]==ages: x2_y2+=1 if a[2]==KILLP: x3_y2+=1 if a[3]==drink: x4_y2+=1 if a[4]==smoke: x5_y2+=1 if a[5]==days: x6_y2+=1 #計算每種癥狀在心梗下的概率 x1_y1, x2_y1, x3_y1, x4_y1, x5_y1, x6_y1 = x1_y1/y1, x2_y1/y1, x3_y1/y1, x4_y1/y1, x5_y1/y1, x6_y1/y1 #計算每種癥狀在不穩定性心絞痛的概率 x1_y2, x2_y2, x3_y2, x4_y2, x5_y2, x6_y2 = x1_y2/y2, x2_y2/y2, x3_y2/y2, x4_y2/y2, x5_y2/y2, x6_y2/y2 #多個癥狀在心梗下的概率 x_y1 = x1_y1 * x2_y1 * x3_y1 * x4_y1 * x5_y1 * x6_y1 #多個癥狀在不穩定性心絞痛下的概率 x_y2 = x1_y2 * x2_y2 * x3_y2 * x4_y2 * x5_y2 * x6_y2 ##初始化各個特征x的值 x1,x2,x3,x4,x5,x6=0,0,0,0,0,0 for a in data_arr: if a[0]==xingbie: x1+=1 if a[1]==ages: x2+=1 if a[2]==KILLP: x3+=1 if a[3]==drink: x4+=1 if a[4]==smoke: x5+=1 if a[5]==days: x6+=1 lens = len(data_arr) #所有x的可能性 x = x1/lens * x2/lens * x3/lens * x4/lens * x5/lens* x6/lens # 分別計算心梗和不穩定性心絞痛的概率 y1_x = (x_y1)*(y1/lens)/x print(y1_x) y2_x = (x_y2)*(y2/lens)/x print(y2_x) # 判斷是哪中疾病的可能更大 if y1_x > y2_x: print(‘病人患心梗的可能更大,可能性為:‘,y1_x) else: print(‘病人患不穩定性心絞痛的可能更大,可能性為:‘,y2_x) # 判斷:性別=‘男’,年齡<70, KILLP=1,飲酒=‘是’,吸煙=‘是”,住院天數<7 NB(0,1,1,‘是‘,‘是‘,1)
分類與監督學習,樸素貝葉斯分類算法