[數據挖掘]樸素貝葉斯分類

寫在前面的話:html

  我如今大四,畢業設計是作一個基於大數據的用戶畫像研究分析。因此開始學習數據挖掘的相關技術。這是我學習的一個新技術領域,學習難度比我以往學過的全部技術都難。雖然如今在一家公司實習,可是工做仍是挺忙的,常常要加班,不管工做多忙,仍是決定要寫一個專欄,這個專欄就寫一些數據挖掘算法、數據結構、算法設計和分析的相關文章。經過寫博文來督促本身不斷學習。之前對於數學沒有多大的興趣愛好,從小到大,學數學也是爲了考試能考個好的成績,學過的不少數學知識,並無深入的感覺到它的用途,不用也就慢慢遺忘,但自從我看了數學之美這本書和開始學習數據挖掘後,使我對數學有了很大的興趣。數學源於生活,用於生活。數據挖掘中涉及到不少統計學、線性代數、微積分等相關知識,而個人不少數學知識都已經還給我之前的老師了,因此如今只能慢慢一點一點撿起來。要感謝網上有不少做者寫出的好的文章,讓我受益不淺,也算是站在他們的肩膀上學習。減小了個人學習困難,而我今天開始寫的專欄裏的一系列文章,不少例子都是借鑑於他們文章中的例子。想了想,這個專欄名稱就叫<<算法大雜燴>>,之後我會把我工做中用到的、本身學習的新算法、以及回顧梳理的每個算法的學習筆記和心得都更新到這個專欄裏。寫的博文不免會有寫得很差的地方,歡迎你們指正,我也喜歡和有共同窗習愛好的人一塊兒學習交流。程序員

不必定天天都更會更新,可是確定會堅持寫下去。算法

今天寫的第一篇博文,是關於樸素貝葉斯分類的。幾年前,我就據說過這個算法,只是稍微瞭解一點點,僅僅停留在只知道它是經過貝葉斯定理來分類的。寫這篇文章以前,我看了不少的相關知識,包括書籍和網上的一些優秀的博文。哈哈,到如今也應該算對於這個算法入門了吧。後面的參考連接中會附上一些參考的文章地址。編程

樸素貝葉斯分類

 

引子

  樸素貝葉斯分類是一種經常使用的分類算法,他根據研究對象的某些特徵,來推斷出該研究對象屬於該研究領域的哪一個類別。
 
數學是解決咱們生活中產生的各類問題的。因此,數學源於生活,生活中也到處體現數學,咱們編程,不過是把人可以理解的數學知識轉換成計算機可以理解的形式來解決實際問題。拿樸素貝葉斯分類來講,其實生活中比比皆是,舉個例子:
 
咱們在大街上看到一我的,猜想他屬於哪一個職業。這就是一種分類,你是根據什麼來判斷的。多是根據這我的的穿着打扮,言談舉止。
 
穿着打扮:鬍子拉碴、頭髮亂七八糟,揹着大的電腦包
言談舉止:雙眼無神(估計在想哪一個bug的解決辦法),黑眼圈重,頭髮沒洗。
 
因此,我大概能看出這我的職業是程序員(開個玩笑,這只是程序員自黑而已,我身邊的程序員都不是這樣的,固然也包括我)。
 
其實穿着打扮、言談舉止就是人的特徵屬性
 
咱們要對某個對象分類,必須根據他的特徵屬性來判斷。
 
 

概述

要了解貝葉斯分類,必須瞭解貝葉斯定理,貝葉斯定理離不開條件機率
 
條件機率定義:
事件A在另一個 事件B已經發生條件下的發生 機率。條件 機率表示爲P(A|B),讀做「在B條件下A的機率」。
根據文氏圖,能夠很清楚地看到在事件B發生的狀況下,事件A發生的機率就是P(A∩B)除以P(B)。
 

根據文氏圖,能夠很清楚地看到在事件B發生的狀況下,事件A發生的機率就是P(A∩B)除以P(B)。網絡

 

P(A|B)=P(A∩B)/P(B)數據結構

     

 

所以,函數

 

P(A∩B)=P(A|B)P(B)學習

    

因此,大數據

 

P(A|B)P(B)=P(B|A)P(A)網站

    

 

P(A|B)=P(B|A)P(A)/P(B)


    

 

 
上面的公式就是貝葉斯定理
 
生活中,咱們常常知道這種狀況 ,P(A|B),可是不知道P(B|A).好比:
A:   表示用戶收入高
B:表示訂購2G流量套餐
 
 
P(A|B) 表示訂購2G流量套餐的用戶收入高的機率,這個能夠經過統計的樣本算出獲得。
可是如今有一個用戶收入高(A),他購買2G流量套餐(B)的機率是多少,即P(B|A),這纔是咱們關注
 
 
因此經過貝葉斯定理,咱們能夠把這二者掛上鉤,求出咱們想知道的P(B|A)
 
 

病人疾病預測分類例子

 
看一個簡單的形式化的列子,來講明貝葉斯分類的做用
 
這個例子來自:阮一峯老師的介紹貝葉斯應用博文中的一個病人分類的例子
 
以下:其中特徵屬性是症狀和職業,類別是疾病(包括感冒,過敏、腦震盪)
某個醫院早上收了六個門診病人,以下表。
  
[plain]  view plain  copy
 
 print?
  1.   症狀  職業   疾病  
  2. 打噴嚏 護士   感冒   
  3. 打噴嚏 農夫   過敏   
  4. 頭痛  建築工人 腦震盪   
  5. 頭痛  建築工人 感冒   
  6. 打噴嚏 教師   感冒   
  7. 頭痛  教師   腦震盪  
如今又來了第七個病人,是一個打噴嚏的建築工人。請問他患上感冒的機率有多大?
根據 貝葉斯定理
 P(A|B) = P(B|A) P(A) / P(B)
可得
   
[plain]  view plain  copy
 
 print?
  1. P(感冒|打噴嚏x建築工人)   
  2.     = P(打噴嚏x建築工人|感冒) x P(感冒)   
  3.     / P(打噴嚏x建築工人)  
假定"打噴嚏"和"建築工人"這兩個特徵是獨立的,所以,上面的等式就變成了
   
[plain]  view plain  copy
 
 print?
  1. P(感冒|打噴嚏x建築工人)   
  2.     = P(打噴嚏|感冒) x P(建築工人|感冒) x P(感冒)   
  3.     / P(打噴嚏) x P(建築工人)  
這是能夠計算的。
  
[plain]  view plain  copy
 
 print?
  1. P(感冒|打噴嚏x建築工人)   
  2.     = 0.66 x 0.33 x 0.5 / 0.5 x 0.33   
  3.     = 0.66  
所以,這個打噴嚏的建築工人,有66%的機率是得了感冒。同理,能夠計算這個病人患上過敏或腦震盪的機率。比較這幾個機率,就能夠知道他最可能得什麼病。
 
 
這就是貝葉斯分類器的基本方法: 在統計資料的基礎上,依據找到的一些特徵屬性,來計算各個類別的機率,找到機率最大的類,從而實現分類。
 

貝葉斯分類的定義

一、設爲一個待分類項,而每一個a爲x的一個特徵屬性。

      二、有類別集合

      三、計算

      四、求出在X個屬性條件下,全部類別的機率,選取機率最大的。則X屬於機率最大的類別

,則。 

 根據貝葉斯定理,要求P(A|B),只要求出P(B|A)便可 .這裏Y指A,X指B.把B分解爲各個特徵屬性,求出每一個類別的每一個特徵屬性便可,以下

   一、找到一個已知分類的待分類項集合,這個集合叫作訓練樣本集。   

   二、統計獲得在各種別下各個特徵屬性的條件機率估計。即

   三、若是各個特徵屬性是條件獨立的,則根據貝葉斯定理有以下推導:

      

      由於分母對於全部類別爲常數,由於咱們只要將分子最大化皆可。又由於各特徵屬性是條件獨立的,因此有:

      

上式等號右邊的每一項,均可以從統計資料中獲得,由此就能夠計算出每一個類別對應的機率,從而找出最大機率的那個類。

注意:各個特徵屬性是條件獨立的,這是樸素貝葉斯所要求的,若是各個特徵屬性不獨立,就不屬於樸素貝葉斯,屬於貝葉斯網絡,後面的文章會講解。

 

帳號真假檢測例子

再看一個例子,該例子來自網上張陽的算法雜貨鋪博文

 

根據某社區網站的抽樣統計,該站10000個帳號中有89%爲真實帳號(設爲C0),11%爲虛假帳號(設爲C1)。

  C0 = 0.89

  C1 = 0.11

接下來,就要用統計資料判斷一個帳號的真實性。假定某一個帳號有如下三個特徵:

    F1: 日誌數量/註冊天數 
    F2: 好友數量/註冊天數 
    F3: 是否使用真實頭像(真實頭像爲1,非真實頭像爲0)

    F1 = 0.1 
    F2 = 0.2 
    F3 = 0

請問該帳號是真實帳號仍是虛假帳號?

方法是使用樸素貝葉斯分類器,計算下面這個計算式的值。

    P(F1|C)P(F2|C)P(F3|C)P(C)

雖然上面這些值能夠從統計資料獲得,可是這裏有一個問題:F1和F2是連續變量,不適宜按照某個特定值計算機率。

一個技巧是將連續值變爲離散值,計算區間的機率。好比將F1分解成[0, 0.05]、(0.05, 0.2)、[0.2, +∞]三個區間,而後計算每一個區間的機率。在咱們這個例子中,F1等於0.1,落在第二個區間,因此計算的時候,就使用第二個區間的發生機率。

根據統計資料,可得:

  P(F1|C0) = 0.5, P(F1|C1) = 0.1 
  P(F2|C0) = 0.7, P(F2|C1) = 0.2 
  P(F3|C0) = 0.2, P(F3|C1) = 0.9

所以,

  P(F1|C0) P(F2|C0) P(F3|C0) P(C0) 
    = 0.5 x 0.7 x 0.2 x 0.89 
    = 0.0623

  P(F1|C1) P(F2|C1) P(F3|C1) P(C1) 
    = 0.1 x 0.2 x 0.9 x 0.11 
    = 0.00198

能夠看到,雖然這個用戶沒有使用真實頭像,可是他是真實帳號的機率,比虛假帳號高出30多倍,所以判斷這個帳號爲真。

 

貝葉斯分類的含義

 長久以來,人們對一件事情發生或不發生的機率,只有固定的0和1,即要麼發生,要麼不發生,歷來不會去考慮某件事情發生的機率有多大,不發生的機率又是多大。好比若是問那時的人們一個問題:「有一個袋子,裏面裝着若干個白球和黑球,請問從袋子中取得白球的機率是多少?」他們會想都不用想,會立馬告訴你,取出白球的機率就是1/2,要麼取到白球,要麼取不到白球,即θ只能有一個值,不是1/2,就是0,並且不論你取了多少次,取得白球的機率θ始終都是1/2,即不隨觀察結果X 的變化而變化。

直到貝葉斯定理的出現,貝葉斯定理不把機率θ看作一個固定的值(好比上面取白球的機率一直都是1/2),而看作一個隨機變量,他會隨着觀察結果變化

 

貝葉斯及貝葉斯派提出了一個思考問題的固定模式:

  • 先驗分佈 + 樣本信息  後驗分佈

    上述思考模式意味着,新觀察到的樣本信息將修正人們之前對事物的認知。換言之,在獲得新的樣本信息以前,人們對的認知是先驗分佈,在獲得新的樣本信息後,人們對的認知爲

 

 

條件機率公式進行變形,能夠獲得以下形式:

 

     P(A|B)=P(A)    *    P(B|A)/P(B)

咱們把P(A)稱爲"先驗機率",即在事件B發生以前,事件A發生的機率,在事件B發生以前,它是一個無條件分佈,由於A尚未與事件B關聯上,他是先驗分佈。

 

P(A|B)稱爲"後驗機率"(Posterior probability),即在B事件發生以後,咱們對A事件機率的從新評估。P(B|A)/P(B)稱爲"可能性函數"(Likelyhood),這是一個調整因子,使得預估機率更接近真實機率。它的分佈就是後驗分佈

因此,條件機率能夠理解成下面的式子:

  後驗機率 = 先驗機率 x 調整因子

這就是貝葉斯推斷的含義。咱們先預估一個"先驗機率",而後加入實驗結果,看這個實驗究竟是加強仍是削弱了"先驗機率",由此獲得更接近事實的"後驗機率"。

在這裏,若是"可能性函數"P(B|A)/P(B)>1,意味着"先驗機率"被加強,事件A的發生的可能性變大;若是"可能性函數"=1,意味着B事件無助於判斷事件A的可能性;若是"可能性函數"<1,意味着"先驗機率"被削弱,事件A的可能性變小。

 

水果糖問題例子

這個例子一樣來自阮一峯老師的博文,加深對貝葉斯推斷的理解

 

 

第一個例子。兩個如出一轍的碗,一號碗有30顆水果糖和10顆巧克力糖,二號碗有水果糖和巧克力糖各20顆。如今隨機選擇一個碗,從中摸出一顆糖,發現是水果糖。請問這顆水果糖來自一號碗的機率有多大?

咱們假定,H1表示一號碗,H2表示二號碗。因爲這兩個碗是同樣的,因此P(H1)=P(H2),也就是說,在取出水果糖以前,這兩個碗被選中的機率相同。所以,P(H1)=0.5,咱們把這個機率就叫作"先驗機率",即沒有作實驗以前,來自一號碗的機率是0.5。

再假定,E表示水果糖,因此問題就變成了在已知E的狀況下,來自一號碗的機率有多大,即求P(H1|E)。咱們把這個機率叫作"後驗機率",即在E事件發生以後,對P(H1)的修正。

根據貝葉斯定理,獲得

 

P(H1|E)=P(H1)  *  P(E|H1)/P(E)

已知,P(H1)等於0.5,P(E|H1)爲一號碗中取出水果糖的機率,等於0.75,那麼求出P(E)就能夠獲得答案。根據全機率公式(不懂全機率公式的能夠查找相關資料理解),

    

 P(E)=P(E|H1) * P(H1)  +  P(E|H2)*P(H2)

 

因此,將數字代入原方程,獲得

 

 

P(H1|E)=0.5*   0.75/0.625=0.6
    

 

 

這代表,來自一號碗的機率是0.6。也就是說,取出水果糖以後,H1事件的可能性獲得了加強。

 

 

連續型特徵屬性和零機率事件處理

 

上面講的特徵屬性值,都是離散的,帳號真假檢測例子中把連續的轉換成區間,每一個區間也能夠當作離散的,可是若是在不能這樣轉換的狀況下怎麼解決?若是特徵屬性值是否是離散的,而是連續的怎麼辦?

咱們是站在巨人的肩膀上,前人早已經爲咱們找到了應對之策

 

當特徵屬性爲連續值時,一般假定其值服從高斯分佈(也稱正態分佈)。即:

      

      而

      所以只要計算出訓練樣本中各個類別中此特徵項劃分的各均值和標準差,代入上述公式便可獲得須要的估計值。(ak爲觀察到的屬性值)

      另外一個須要討論的問題就是當P(a|y)=0怎麼辦,當某個類別下某個特徵項劃分沒有出現時,就是產生這種現象,這會令分類器質量大大下降。爲了解決這個問題,引入了拉普拉斯校準,它的思想很是簡單,就是對沒類別下全部劃分(機率爲零的)的計數加1,這樣若是訓練樣本集數量充分大時,並不會對結果產生影響,而且解決了上述頻率爲零的尷尬局面。

 

買電腦是否和收入相關的例子

 

驗證買電腦,是否和收入有關的場景下:

類 buys_computer=yes包含1000個元組,有0個元組income=low  ,990個元組 income=medium,10個元組income=high,這些事件的機率分別是0,    0.990,    0.010.

有機率爲0,確定不行.使用拉普拉斯校準,對每一個收入-值對應加1個元組,分別獲得以下機率

 

 

[plain]  view plain  copy
 
 print?
  1. 1/1003=0.001      
  2.   
  3. 991/1003=0.998  
  4.   
  5. 11/1003=0.011  

這些校準的機率估計與對應的未校準的估計很接近,可是避免了零機率值

 

性別分類的例子

再看一個阮一峯老師的樸素貝葉斯應用一文中摘自維基百科的例子,關於處理連續變量的另外一種方法。

下面是一組人類身體特徵的統計資料。

 

 

[plain]  view plain  copy
 
 print?
  1.  性別  身高(英尺) 體重(磅) 腳掌(英寸)  
  2. 男     6       180     12   
  3.  男     5.92     190     11   
  4. 男     5.58     170     12   
  5. 男     5.92     165     10   
  6. 女     5       100      6   
  7. 女     5.5      150      8   
  8. 女     5.42     130      7   
  9. 女     5.75     150      9  



 

已知某人身高6英尺、體重130磅,腳掌8英寸,請問該人是男是女?

根據樸素貝葉斯分類器,計算下面這個式子的值。

P(身高|性別) x P(體重|性別) x P(腳掌|性別) x P(性別)

這裏的困難在於,因爲身高、體重、腳掌都是連續變量,不能採用離散變量的方法計算機率。並且因爲樣本太少,因此也沒法分紅區間計算。怎麼辦?

這時,能夠假設男性和女性的身高、體重、腳掌都是正態分佈,經過樣本計算出均值和方差,也就是獲得正態分佈的密度函數。有了密度函數,就能夠把值代入,算出某一點的密度函數的值。

好比,男性的身高是均值5.85五、方差0.035的正態分佈。因此,男性的身高爲6英尺的機率的相對值等於1.5789(大於1並無關係,由於這裏是密度函數的值,只用來反映各個值的相對可能性)。

有了這些數據之後,就能夠計算性別的分類了。

  P(身高=6|男) x P(體重=130|男) x P(腳掌=8|男) x P(男) 
    = 6.1984 x e-9

  P(身高=6|女) x P(體重=130|女) x P(腳掌=8|女) x P(女) 
    = 5.3778 x e-4

能夠看到,女性的機率比男性要高出將近10000倍,因此判斷該人爲女性。

 

下一篇會寫貝葉斯網絡。

 

參考文章:

http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html

http://www.ruanyifeng.com/blog/2013/12/naive_bayes_classifier.html

http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html

http://blog.csdn.net/zdy0_2004/article/details/41096141

 

參考書籍:數據挖掘概念與技術。數據挖掘十大算法,統計學機率論方面的數學知識

碼字不易,轉載請指明出自http://blog.csdn.net/tanggao1314/article/details/66478782

相關文章
相關標籤/搜索