貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理爲基礎,故統稱爲貝葉斯分類。本文做爲分類算法的第一篇,將首先介紹分類問題,對分類問題進行一個正式的定義。而後,介紹貝葉斯分類算法的基礎——貝葉斯定理。最後,經過實例討論貝葉斯分類中最簡單的一種:樸素貝葉斯分類。html
對於分類問題,其實誰都不會陌生,說咱們每一個人天天都在執行分類操做一點都不誇張,只是咱們沒有意識到罷了。例如,當你看到一個陌生人,你的腦子下意識判斷TA是男是女;你可能常常會走在路上對身旁的朋友說「這我的一看就頗有錢、那邊有個非主流」之類的話,其實這就是一種分類操做。算法
從數學角度來講,分類問題可作以下定義:數據庫
已知集合:和
,肯定映射規則
,使得任意
有且僅有一個
使得
成立。(不考慮模糊數學裏的模糊集狀況)網絡
其中C叫作類別集合,其中每個元素是一個類別,而I叫作項集合,其中每個元素是一個待分類項,f叫作分類器。分類算法的任務就是構造分類器f。app
這裏要着重強調,分類問題每每採用經驗性方法構造映射規則,即通常狀況下的分類問題缺乏足夠的信息來構造100%正確的映射規則,而是經過對經驗數據的學習從而實現必定機率意義上正確的分類,所以所訓練出的分類器並非必定能將每一個待分類項準確映射到其分類,分類器的質量與分類器構造方法、待分類數據的特性以及訓練樣本數量等諸多因素有關。運維
例如,醫生對病人進行診斷就是一個典型的分類過程,任何一個醫生都沒法直接看到病人的病情,只能觀察病人表現出的症狀和各類化驗檢測數據來推斷病情,這時醫生就比如一個分類器,而這個醫生診斷的準確率,與他當初受到的教育方式(構造方法)、病人的症狀是否突出(待分類數據的特性)以及醫生的經驗多少(訓練樣本數量)都有密切關係。函數
每次提到貝葉斯定理,我心中的崇敬之情都油然而生,倒不是由於這個定理多高深,而是由於它特別有用。這個定理解決了現實生活裏常常遇到的問題:已知某條件機率,如何獲得兩個事件交換後的機率,也就是在已知P(A|B)的狀況下如何求得P(B|A)。這裏先解釋什麼是條件機率:學習
表示事件B已經發生的前提下,事件A發生的機率,叫作事件B發生下事件A的條件機率。其基本求解公式爲:
。測試
貝葉斯定理之因此有用,是由於咱們在生活中常常遇到這種狀況:咱們能夠很容易直接得出P(A|B),P(B|A)則很難直接得出,但咱們更關心P(B|A),貝葉斯定理就爲咱們打通從P(A|B)得到P(B|A)的道路。spa
下面不加證實地直接給出貝葉斯定理:
樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素貝葉斯分類是由於這種方法的思想真的很樸素,樸素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的機率,哪一個最大,就認爲此待分類項屬於哪一個類別。通俗來講,就比如這麼個道理,你在街上看到一個黑人,我問你你猜這哥們哪裏來的,你十有八九猜非洲。爲何呢?由於黑人中非洲人的比率最高,固然人家也多是美洲人或亞洲人,但在沒有其它可用信息下,咱們會選擇條件機率最大的類別,這就是樸素貝葉斯的思想基礎。
樸素貝葉斯分類的正式定義以下:
一、設爲一個待分類項,而每一個a爲x的一個特徵屬性。
二、有類別集合。
三、計算。
四、若是,則
。
那麼如今的關鍵就是如何計算第3步中的各個條件機率。咱們能夠這麼作:
一、找到一個已知分類的待分類項集合,這個集合叫作訓練樣本集。
二、統計獲得在各種別下各個特徵屬性的條件機率估計。即
。
三、若是各個特徵屬性是條件獨立的,則根據貝葉斯定理有以下推導:
由於分母對於全部類別爲常數,由於咱們只要將分子最大化皆可。又由於各特徵屬性是條件獨立的,因此有:
根據上述分析,樸素貝葉斯分類的流程能夠由下圖表示(暫時不考慮驗證):
能夠看到,整個樸素貝葉斯分類分爲三個階段:
第一階段——準備工做階段,這個階段的任務是爲樸素貝葉斯分類作必要的準備,主要工做是根據具體狀況肯定特徵屬性,並對每一個特徵屬性進行適當劃分,而後由人工對一部分待分類項進行分類,造成訓練樣本集合。這一階段的輸入是全部待分類數據,輸出是特徵屬性和訓練樣本。這一階段是整個樸素貝葉斯分類中惟一須要人工完成的階段,其質量對整個過程將有重要影響,分類器的質量很大程度上由特徵屬性、特徵屬性劃分及訓練樣本質量決定。
第二階段——分類器訓練階段,這個階段的任務就是生成分類器,主要工做是計算每一個類別在訓練樣本中的出現頻率及每一個特徵屬性劃分對每一個類別的條件機率估計,並將結果記錄。其輸入是特徵屬性和訓練樣本,輸出是分類器。這一階段是機械性階段,根據前面討論的公式能夠由程序自動計算完成。
第三階段——應用階段。這個階段的任務是使用分類器對待分類項進行分類,其輸入是分類器和待分類項,輸出是待分類項與類別的映射關係。這一階段也是機械性階段,由程序完成。
這一節討論P(a|y)的估計。
由上文看出,計算各個劃分的條件機率P(a|y)是樸素貝葉斯分類的關鍵性步驟,當特徵屬性爲離散值時,只要很方便的統計訓練樣本中各個劃分在每一個類別中出現的頻率便可用來估計P(a|y),下面重點討論特徵屬性是連續值的狀況。
當特徵屬性爲連續值時,一般假定其值服從高斯分佈(也稱正態分佈)。即:
而
所以只要計算出訓練樣本中各個類別中此特徵項劃分的各均值和標準差,代入上述公式便可獲得須要的估計值。均值與標準差的計算在此再也不贅述。
另外一個須要討論的問題就是當P(a|y)=0怎麼辦,當某個類別下某個特徵項劃分沒有出現時,就是產生這種現象,這會令分類器質量大大下降。爲了解決這個問題,咱們引入Laplace校準,它的思想很是簡單,就是對沒類別下全部劃分的計數加1,這樣若是訓練樣本集數量充分大時,並不會對結果產生影響,而且解決了上述頻率爲0的尷尬局面。
下面討論一個使用樸素貝葉斯分類解決實際問題的例子,爲了簡單起見,對例子中的數據作了適當的簡化。
這個問題是這樣的,對於SNS社區來講,不真實帳號(使用虛假身份或用戶的小號)是一個廣泛存在的問題,做爲SNS社區的運營商,但願能夠檢測出這些不真實帳號,從而在一些運營分析報告中避免這些帳號的干擾,亦能夠增強對SNS社區的瞭解與監管。
若是經過純人工檢測,須要耗費大量的人力,效率也十分低下,如能引入自動檢測機制,必將大大提高工做效率。這個問題說白了,就是要將社區中全部帳號在真實帳號和不真實帳號兩個類別上進行分類,下面咱們一步一步實現這個過程。
首先設C=0表示真實帳號,C=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(是)}。
二、獲取訓練樣本
這裏使用運維人員曾經人工檢測過的1萬個帳號做爲訓練樣本。
三、計算訓練樣本中每一個類別的頻率
用訓練樣本中真實帳號和不真實帳號數量分別除以一萬,獲得:
四、計算每一個類別條件下各個特徵屬性劃分的頻率
五、使用分類器進行鑑別
下面咱們使用上面訓練獲得的分類器鑑別一個帳號,這個帳號使用非真實頭像,日誌數量與註冊天數的比率爲0.1,好友數與註冊天數的比率爲0.2。
能夠看到,雖然這個用戶沒有使用真實頭像,可是經過分類器的鑑別,更傾向於將此帳號納入真實帳號類別。這個例子也展現了當特徵屬性充分多時,樸素貝葉斯分類對個別屬性的抗干擾性。
雖而後續還會提到其它分類算法,不過這裏我想先提一下如何評價分類器的質量。
首先要定義,分類器的正確率指分類器正確分類的項目佔全部被分類項目的比率。
一般使用迴歸測試來評估分類器的準確率,最簡單的方法是用構造完成的分類器對訓練數據進行分類,而後根據結果給出正確率評估。但這不是一個好方法,由於使用訓練數據做爲檢測數據有可能由於過度擬合而致使結果過於樂觀,因此一種更好的方法是在構造初期將訓練數據一分爲二,用一部分構造分類器,而後用另外一部分檢測分類器的準確率。
在上一篇文章中咱們討論了樸素貝葉斯分類。樸素貝葉斯分類有一個限制條件,就是特徵屬性必須有條件獨立或基本獨立(實際上在現實應用中幾乎不可能作到徹底獨立)。當這個條件成立時,樸素貝葉斯分類法的準確率是最高的,但不幸的是,現實中各個特徵屬性間每每並不條件獨立,而是具備較強的相關性,這樣就限制了樸素貝葉斯分類的能力。這一篇文章中,咱們接着上一篇文章的例子,討論貝葉斯分類中更高級、應用範圍更廣的一種算法——貝葉斯網絡(又稱貝葉斯信念網絡或信念網絡)。
上一篇文章咱們使用樸素貝葉斯分類實現了SNS社區中不真實帳號的檢測。在那個解決方案中,我作了以下假設:
i、真實帳號比非真實帳號平均具備更大的日誌密度、各大的好友密度以及更多的使用真實頭像。
ii、日誌密度、好友密度和是否使用真實頭像在帳號真實性給定的條件下是獨立的。
可是,上述第二條假設極可能並不成立。通常來講,好友密度除了與帳號是否真實有關,還與是否有真實頭像有關,由於真實的頭像會吸引更多人加其爲好友。所以,咱們爲了獲取更準確的分類,能夠將假設修改以下:
i、真實帳號比非真實帳號平均具備更大的日誌密度、各大的好友密度以及更多的使用真實頭像。
ii、日誌密度與好友密度、日誌密度與是否使用真實頭像在帳號真實性給定的條件下是獨立的。
iii、使用真實頭像的用戶比使用非真實頭像的用戶平均有更大的好友密度。
上述假設更接近實際狀況,但問題隨之也來了,因爲特徵屬性間存在依賴關係,使得樸素貝葉斯分類不適用了。既然這樣,我去尋找另外的解決方案。
下圖表示特徵屬性之間的關聯:
上圖是一個有向無環圖,其中每一個節點表明一個隨機變量,而弧則表示兩個隨機變量之間的聯繫,表示指向結點影響被指向結點。不過僅有這個圖的話,只能定性給出隨機變量間的關係,若是要定量,還須要一些數據,這些數據就是每一個節點對其直接前驅節點的條件機率,而沒有前驅節點的節點則使用先驗機率表示。
例如,經過對訓練數據集的統計,獲得下表(R表示帳號真實性,H表示頭像真實性):
縱向表頭表示條件變量,橫向表頭表示隨機變量。上表爲真實帳號和非真實帳號的機率,而下表爲頭像真實性對於帳號真實性的機率。這兩張表分別爲「帳號是否真實」和「頭像是否真實」的條件機率表。有了這些數據,不但能順向推斷,還能經過貝葉斯定理進行逆向推斷。例如,現隨機抽取一個帳戶,已知其頭像爲假,求其帳號也爲假的機率:
也就是說,在僅知道頭像爲假的狀況下,有大約35.7%的機率此帳戶也爲假。若是以爲閱讀上述推導有困難,請複習機率論中的條件機率、貝葉斯定理及全機率公式。若是給出全部節點的條件機率表,則能夠在觀察值不完備的狀況下對任意隨機變量進行統計推斷。上述方法就是使用了貝葉斯網絡。
有了上述鋪墊,咱們就能夠正式定義貝葉斯網絡了。
一個貝葉斯網絡定義包括一個有向無環圖(DAG)和一個條件機率表集合。DAG中每個節點表示一個隨機變量,能夠是可直接觀測變量或隱藏變量,而有向邊表示隨機變量間的條件依賴;條件機率表中的每個元素對應DAG中惟一的節點,存儲此節點對於其全部直接前驅節點的聯合條件機率。
貝葉斯網絡有一條極爲重要的性質,就是咱們斷言每個節點在其直接前驅節點的值制定後,這個節點條件獨立於其全部非直接前驅前輩節點。
這個性質很相似Markov過程。其實,貝葉斯網絡能夠看作是Markov鏈的非線性擴展。這條特性的重要意義在於明確了貝葉斯網絡能夠方便計算聯合機率分佈。通常狀況先,多變量非獨立聯合條件機率分佈有以下求取公式:
而在貝葉斯網絡中,因爲存在前述性質,任意隨機變量組合的聯合條件機率分佈被化簡成
其中Parents表示xi的直接前驅節點的聯合,機率值能夠從相應條件機率表中查到。
貝葉斯網絡比樸素貝葉斯更復雜,而想構造和訓練出一個好的貝葉斯網絡更是異常艱難。可是貝葉斯網絡是模擬人的認知思惟推理模式,用一組條件機率函數以及有向無環圖對不肯定性的因果推理關係建模,所以其具備更高的實用價值。
構造與訓練貝葉斯網絡分爲如下兩步:
一、肯定隨機變量間的拓撲關係,造成DAG。這一步一般須要領域專家完成,而想要創建一個好的拓撲結構,一般須要不斷迭代和改進才能夠。
二、訓練貝葉斯網絡。這一步也就是要完成條件機率表的構造,若是每一個隨機變量的值都是能夠直接觀察的,像咱們上面的例子,那麼這一步的訓練是直觀的,方法相似於樸素貝葉斯分類。可是一般貝葉斯網絡的中存在隱藏變量節點,那麼訓練方法就是比較複雜,例如使用梯度降低法。因爲這些內容過於晦澀以及牽扯到較深刻的數學知識,在此再也不贅述,有興趣的朋友能夠查閱相關文獻。
貝葉斯網絡做爲一種不肯定性的因果推理模型,其應用範圍很是廣,在醫療診斷、信息檢索、電子技術與工業工程等諸多方面發揮重要做用,而與其相關的一些問題也是近來的熱點研究課題。例如,Google就在諸多服務中使用了貝葉斯網絡。
就使用方法來講,貝葉斯網絡主要用於機率推理及決策,具體來講,就是在信息不完備的狀況下經過能夠觀察隨機變量推斷不可觀察的隨機變量,而且不可觀察隨機變量能夠多於以一個,通常初期將不可觀察變量置爲隨機值,而後進行機率推理。下面舉一個例子。
仍是SNS社區中不真實帳號檢測的例子,咱們的模型中存在四個隨機變量:帳號真實性R,頭像真實性H,日誌密度L,好友密度F。其中H,L,F是能夠觀察到的值,而咱們最關係的R是沒法直接觀察的。這個問題就劃歸爲經過H,L,F的觀察值對R進行機率推理。推理過程能夠以下表示:
一、使用觀察值實例化H,L和F,把隨機值賦給R。
二、計算。其中相應機率值能夠查條件機率表。
因爲上述例子只有一個未知隨機變量,因此不用迭代。更通常得,使用貝葉斯網絡進行推理的步驟可以下描述:
一、對全部可觀察隨機變量節點用觀察值實例化;對不可觀察節點實例化爲隨機值。
二、對DAG進行遍歷,對每個不可觀察節點y,計算,其中wi表示除y之外的其它全部節點,a爲正規化因子,sj表示y的第j個子節點。
三、使用第三步計算出的各個y做爲未知節點的新值進行實例化,重複第二步,直到結果充分收斂。
四、將收斂結果做爲推斷值。
以上只是貝葉斯網絡推理的算法之一,另外還有其它算法,這裏再也不詳述。