本文整理自《機器學習實戰》以及http://write.blog.csdn.net/postedit
一、原理 數學基礎:
很簡單,就是貝葉斯公式:
思想基礎:
對於一個待分類的事物X,求該事物屬於各個類別y1,y2的機率,哪個機率最大,就認為該事物屬於哪個類別。
演算法過程:
1.假設某個待分類的事物x,它有a1,a2,...am這m個特徵屬性
2.有y1,y2,...,yn這n種類別
3.計算。
4.如果,則。
整個演算法的關鍵就是第三步,即分別求出屬於每一種類別的機率。
求每一種類別的機率:
利用貝葉斯公式,可以這麼求:
1.根據訓練樣本集(即已經知道類別的事物),估計各類別下各個特徵屬性的條件機率。即。
2.根據貝葉斯定理有如下推導:(樸素貝葉斯不考慮各個屬性之間的聯絡,各個屬性視為條件獨立)
分母P(x)為常數,所以只要求出分子的最大值即可。
而P(aj | yi)已經通過訓練樣本估算出來了,P(yi)則可以明確的根據類別所佔的數目計算出來。
怎麼估算P(aj | yi):
1.特徵屬性為離散值時:
只需要簡單地計算訓練樣本中類別為yi時aj這個特徵在該劃分集下對應的數目即可。
2.特徵屬性為連續值時:
假設該特徵屬性的值服從常態分佈。即:
因此只要計算出訓練樣本中此特徵項劃分的各個類別機率的均值和標準差(即第k個特徵值為ak時,屬於各個類別的機率 的均值和標準差),代入上述公式即可得到需要的估計值。
怎麼處理P(aj|yi)=0的情況。
引入Laplace校準:
對每個類別下所有劃分的計數加1,這樣如果訓練樣本集數量充分大時,並不會對結果產生影響,並且解決了上述機率為0的尷尬局面。
二、應用
檢測SNS社區中不真實帳號
下面討論一個使用樸素貝葉斯分類解決實際問題的例子,為了簡單起見,對例子中的資料做了適當的簡化。
這個問題是這樣的,對於SNS社區來說,不真實帳號(使用虛假身份或使用者的小號)是一個普遍存在的問題,作為SNS社區的電訊廠商,希望可以檢測出這些不真實帳號,從而在一些運營分析報告中避免這些帳號的幹擾,亦可以加強對SNS社區的瞭解與監管。
如果通過純人工檢測,需要耗費大量的人力,效率也十分低下,如能引入自動檢測機制,必將大大提升工作效率。這個問題說白了,就是要將社區中所有帳號在真實帳號和不真實帳號兩個類別上進行分類,下面我們一步一步實現這個過程。
首先設C=0表示真實帳號,C=1表示不真實帳號。
1、確定特徵屬性及劃分
這一步要找出可以協助我們區分真實帳號與不真實帳號的特徵屬性,在實際應用中,特徵屬性的數量是很多的,劃分也會比較細緻,但這裡為了簡單起見,我們用少量的特徵屬性以及較粗的劃分,並對資料做了修改。
我們選擇三個特徵屬性:a1:日誌數量/註冊天數,a2:好友數量/註冊天數,a3:是否使用真實頭像。在SNS社區中這三項都是可以直接從資料庫裡得到或計算出來的。
下面給出劃分:a1:{a<=0.05, 0.05<a<0.2, a>=0.2},a1:{a<=0.1, 0.1<a<0.8, a>=0.8},a3:{a=0(不是),a=1(是)}。
2、擷取訓練樣本
這裡使用營運人員曾經人工檢測過的1萬個帳號作為訓練樣本。
3、計算訓練樣本中每個類別的頻率
用訓練樣本中真實帳號和不真實帳號數量分別除以一萬,得到:
4、計算每個類別條件下各個特徵屬性劃分的頻率
5、使用分類器進行鑒別
下面我們使用上面訓練得到的分類器鑒別一個帳號,這個帳號使用非真實頭像,日誌數量與註冊天數的比率為0.1,好友數與註冊天數的比率為0.2。
可以看到,雖然這個使用者沒有使用真實頭像,但是通過分類器的鑒別,更傾向於將此帳號歸入真實帳號類別。這個例子也展示了當特徵屬性充分多時,樸素貝葉斯分類對個別屬性的抗幹擾性。