我與機器學習 - [Today is Bayes] - [貝葉斯]
基於貝葉斯決策理論的分類方法
優點:在資料較少的情況下仍然有效,可以處理多類別問題
缺點:對於輸入資料的準備準備方式較為敏感
樸素貝葉斯是貝葉斯決策理論的一部分,我們用p1(x, y)表示資料點(x,y)屬於第一類別,用p2(x,y)表示資料點屬於第二類別,現在有一個新的資料點(x,y),可以用下面的規則來判斷他的類別。
如果p1(x,y) > p2(x,y) 那麼屬於類別1
如果p2(x,y) > p1(x,y)那麼屬於類別2
也就是說會選擇高概率對應的類別。這就是貝葉斯決策理論的核心思想,即選擇具有最高概率的決策。
樸素貝葉斯建立在特徵之間相互獨立基礎假設上的,由統計學知道,如果每個特徵需要N個樣本,那麼對於十個特徵將會需要N **10個樣本,可以看到,所需要的樣本數會隨著特徵數目增大而迅速增長。
但是如果假設特徵之間相互獨立,那樣樣本就可以從N**10下降到10 * N個,所謂獨立指的是統計意義熵的獨立,即一個特徵或者單詞出現的概率和他上一個特徵或者其他相鄰單詞沒有關係。而獨立的這個假設正式樸素貝葉斯中樸素(naive)的含義。樸素貝葉斯的另一個假設是每個特徵同等重要。
前期準備工作:
訓練詞典,將大量文章分好詞後,製作詞典。
虛擬碼:
建立一個空集set,這個集合就是最後輸出的詞典set
遍歷所有的詞條:
對於每個詞條求當前詞典set和新詞條的並集,新詞條要使用set過濾重複單詞
返回詞典set
訓練完成詞典後,需要做的是對輸入的測試詞條要轉化成和詞典同大小的向量
虛擬碼:
建立一個和詞典同大小的list,元素全部為0的詞向量
遍歷輸入的詞條中的單詞
對於每個單詞判斷其是否在詞典中
如果在詞典中,則獲取詞典中該單詞的下標,令詞向量該下標的數值等於1
返回詞向量
然後就是訓練的演算法了
首先看一下訓練所依據的數學理論,看下面這段文字就可以
其中,p(w1|c1)表示在類別1發生的條件下。單詞1出現的頻率,這裡不太好理解,就是說,判斷一個訓練的詞向量,如果他是第一個類別,就計算單詞1的數目,除以第一個類別中詞的總數目
訓練過程的虛擬碼:思路就是計算貝葉斯公式中的未知量p(ci)和p(wi|ci)
計算該類別佔所有類別的數目即為p(ci)
初始化大小等於詞典長度,大小全為0的詞向量,數目應該等於類別的數目
遍歷訓練資料
對每一個訓練資料詞條,獲取該詞條的類別
在該類別發生的前提下,計算每一個單詞在該類別全部單詞中所佔的比重,也就是p(wi|ci)
返回p(ci)和p(wi|ci)
在計算的過程中因為要計算每一個單詞在該類別單詞數量所佔比重的乘積,即計算p(w1|c1),p(w2|c1),p(w3|c1)
的乘積,如果其中一個為0則算出來也為0,為降低這種影響,可以將所有次的出現次數初始化為全1,將分母初始化為2
還有就是如果一個單詞在該類別所有單詞的比重很小,會造成很多很小的數相乘,造成下溢位,可以對乘積取自然對數。
ln(a * b) = ln(a)+ln(b)
以上部分小結:對於分類而言,有時候使用概率比使用硬規則更為有效,貝葉斯概率以及貝葉斯準則提供了一種利用已知值來估計位置概率的方法,通過條件之間的獨立性假設,降低對資料量的需求。
以上部分程式碼:https://github.com/HanGaaaaa/MLAProject/tree/master/Bayes
進階部分:
相對熵,又稱為互熵,交叉熵,鑑別資訊,Kullback熵,Kullback- Leible散度等等
公式為:
相對熵都是大於0的,兩個概率分佈反過來的相對熵不相等,相對熵可以用來度量連個隨機變數的距離 。
由相對熵引出互資訊:兩個隨機變數的互資訊定義為這兩個隨機變數的聯合分佈和這兩個隨機變數獨立分佈乘積的相對熵
公式:
複習資訊增益:資訊增益是指,在知道特徵A的情況下,對資料集D的不確定性減少的程度
由貝葉斯公式帶來的思考:
其中第二個等式的化簡就用於上半部分演算法的實現。
貝葉斯網路:
把某個系統的隨機變數,根據是否條件獨立,繪製在一個有向圖中,就形成了貝葉斯網路,只是單純一個網路。
一般而言,貝葉斯網路的有向無環圖中,節點表示隨機變數,連線兩個節點之間的箭頭表示兩個變數直接是具有因果關係的(非條件獨立)
一個簡單的貝葉斯網路:
這個也叫全連線貝葉斯網路C32 3*2 /2 = 3 條邊,即每一對節點之間都有連線
但是更多時候一個正常的貝葉斯網路一般是這個樣子的:
利用貝葉斯網路計算概率:
三種利用貝葉斯網路來判斷獨立性的情況
第一種 T2T樣式
第二種 H2T樣式
第三種 H2H樣式
D-separation 有向分離
上述三種情況是節點與節點之間,也可以推廣到集合與集合之間。
再看樸素貝葉斯,首先是假設部分:
利用貝葉斯公式得到:
得到樸素貝葉斯演算法的核心就是,想要求得某個樣本屬於某個類別的概率,只要求得該類別在所有類別中的概率乘以該類別下每個特徵出現的頻率,
進一步推導:
此時就是求p(y)和p(xi | y),p(y)其實就是該類別的樣本數目除以樣本總數目,即該類別所佔的比重。
而p(xi | y)就是在該類別內的樣本,特徵xi出現的頻率
當p(xi | y)服從高斯分佈時,會求得該類別的均值和方差,就是模型的引數:
當p(xi | y)服從多項分佈時,就是求該類別下某個特徵出現的次數除以該類別下所有特徵出現的次數,就是模型的引數:
這裡的拉普拉斯平滑, 下面還會講一下,就是上半部分提到的一些處理裡面的把初始值都設為1的做法。
樸素貝葉斯的推導就是這些,下面再看看郵件分類系統
首先處理所有文字得到詞典和把訓練資料每一條都輸出成詞向量:
然後計算模型的引數 p(c) 和 p(x | c):
p(x | c)要怎麼算呢,這裡用到了拉普拉斯平滑:
拉普拉斯平滑能夠避免0/0帶來的演算法異常,例如洛杉磯湖人隊和勇士隊兩隻球隊在過去打過5場比賽,其中洛杉磯贏過3場,勇士贏過2場,這時候估計第六場的勝率時,不需要拉普拉斯平滑,因為估計湖人隊勝率為3/5,勇士2/5,但是如果過去5場比賽,湖人勝了5場,勇士勝了0場,這時候估計第六場勝率時,湖人的勝率會估計為1,顯然這不太科學,這時候就體現出拉普拉斯平滑的作用,我們可以初始給湖人和勇士的勝場都加1,這時候總場數為 湖人(6場),勇士(1場) 6+1等於7場,湖人勝率為6/7,勇士勝率為1/7,這樣顯然資料更加科學。所以,在做拉普拉斯平滑時,分子和分母都要同時變化,保證概率和為1.
下半部分程式碼:
https://github.com/HanGaaaaa/MLAPractice/tree/master/BayesNetwork