點擊上方藍色字體,關注AI小白入門喲
跟着博主的腳步,每天進步一點點
本文介紹了樸素貝葉斯模型,樸素貝葉斯(幾乎所有的概率模型)的核心假設:特徵之間的條件概率相互獨立。以垃圾郵件分類問題爲例,分析了樸素貝葉斯模型的兩種應用場景:1)先驗分佈和條件概率分佈都爲一元伯努利分佈,2)先驗分佈爲一元伯努利分佈,條件概率分佈爲多元伯努利分佈。分別對應詞袋子表示中兩種常用的方法: one-hot表示,編號表示(詞頻表示)。
作者 | 文傑
編輯 | yuquanle
樸素貝葉斯
A、樸素貝葉斯
樸素貝葉斯模型也是一個典型的生成模型,一般用來處理離散值數據(伯努利分佈導致)。其核心假設是特徵之間的條件概率是相互獨立的。同樣由貝葉斯公式有:
下面以垃圾郵件分類介紹兩類問題的樸素貝葉斯模型:
垃圾郵件分類任務是一個基本文本分類任務,涉及到NLP的初步知識-文本的One-hot表示。由於機器學習模型通常是一個數學模型,而非數值型屬性是不能直接處理,所以一般對郵件的特徵進行編碼。首先將所有的郵件中出現的詞統計出來作爲一個詞典,並對每一個詞進行編碼向量化(即詞序)。一封郵件對應的One-hot表示如下:
其中表示第封郵件,,表示詞典中的第個詞,如果第個詞在第封郵件中出現則,反之爲。可以看出這種表示忽略了文本的大量信息,上下文信息,詞出現的次數等。
由上面的公式有,一封郵件是垃圾郵件的概率可以表示爲下式:
其中似然函數爲在垃圾郵件下產生的條件概率,爲垃圾郵件的先驗概率,對於所有樣本都是一致,近似忽略。
由樸素貝葉斯的條件概率獨立性假設有條件概率如下:
其中表示第個特徵。所以,對於一封郵件屬於哪一類的概率爲都有:
郵件之間獨立,所以目標函數最大化所有郵件屬於各自類的概率爲:
從上式可以看出樸素貝葉斯的參數是,,即所有郵件類別的先驗,以及在某一類下出現某個詞的概率。由極大似然估計參數值即爲其期望。
其中表示類別,對應垃圾郵件分類取值爲(),表示第個特徵,表示特徵的取值。由於垃圾郵件中採用one-hot編碼,所以的取值爲(),表示出現。當以上參數確定之後,對於一封新的郵件,根據估計的參數和貝葉斯公式求得樣本屬於哪一類的概率。最後一封郵件屬於哪一類的概率參數表示如下:
one-hot編碼比較特殊:
由於所有類的概率加和爲,垃圾郵件爲二分類,所以郵件屬於概率大於的那一類。
爲了使模型更具普適性,考慮到當某一特徵沒有在訓練集中出現過,即某一個單詞在某一類下沒有出現過,或者某一單詞在某一類下都出現過(意味着不出現的條件概率爲0)。但不能說該單詞在這一類下的條件概率爲0。又或者在所有類中都未出現(即原始訓練集中沒有的詞,而詞典中有的詞,即詞典不依賴於訓練集)。當來一個新樣本時,如果不做處理,那麼只要有一個分量的概率爲0,由於特徵之間的條件概率獨立,連乘形式只要有一個爲0,即整個概率爲0,無意義。
拉普拉斯平滑:
其中爲第個特徵分量的可能取值數。
B、N元多項分佈模型
同樣,上述貝葉斯模型中只考慮單詞是否出現,即單詞特徵服從伯努利分佈,樣本服從n次獨立的伯努利分佈。而忽略了一個單詞可能出現次數對郵件分類的影響。假設要統計某一單詞出現的次數,那麼有多項分佈。只考慮單詞是否出現的貝葉斯模型叫multi-variate Bernoulli event model,後者叫multinational event model。
同樣以郵件分類問題介紹multinational event model,在之前的模型中,我們首先建立詞典,並且特徵向量長度爲詞典長度,並且從詞典出發,對於郵件出現過的單詞,在對應詞典的位置標記爲,反之標記爲產生一個特徵向量。而multinational event model則從郵件出發,表示郵件中第個單詞,其值表示第個單詞在字典中出現的位置,那麼的取值則有,其中V表示字典長度。這樣一封郵件可以表示爲,表示第封郵件的長度。這相當於擲一枚有V面的骰子次,將觀測值記錄下來形成一封郵件。假設出現某一點的情況與第幾次擲無關,也就是單詞在郵件中出現的位置無關,而且每一次投擲都是獨立的,即單詞之間出現的事件是獨立的。
文檔的表示:
-
one-hot表示
-
編號表示
可以看出兩者方式的樣本表示不同之處在於一個以詞典維度對郵件中的詞是否出現進行編碼,一個是以郵件維度對郵件中的詞在詞典中的編號進行編碼,這就導致了兩者表示的維度不同,特徵服從的分佈也不同。
一封郵件屬於垃圾郵件的概率由貝葉斯公式有:
其中似然函數,在垃圾郵件下產生的條件概率,爲垃圾郵件的先驗概率,對於所有樣本都是一致,近似忽略。
由樸素貝葉斯的條件概率獨立性假設有條件概率如下:
其中。同樣最大化似然函數:
其中表示第封郵件的長度。所以上式中的參數有,。由最大似然估計有:
其中與無關,我們需要求的是所有可能的取值。
最後一封郵件屬於哪一類的概率參數表示如下:
其中表示郵件第個詞在詞典中的編號。
one-hot表示和編號表示:
兩種表示最大的差別在於包含的語義信息,one-hot表示信息不夠豐富,只有,所以需要高的維度,而編號表示信息相對豐富,維度低。然而on-hot表示是可以直接度量兩個樣本之間的相似性的(表示是否存在,有語義意義的),而編號表示則不能直接度量兩個樣本之間的相似性(在詞典中的編號是無語義的),但是可以把編號表示放回到集合中去度量兩個樣本的重合度。所以編號表示可以看作是one-hot的一種低維表示。
代碼實戰
int trainNB(Matrix X,Matrix Y)//訓練函數的實現,注意對參數進行平滑處理
{
//類,特徵,特徵取值
bayes.pY.initMatrix(CLASS_SUM,1,0,"ss");//兩類初始化爲2行的列向量
bayes.pX_1Y.initMatrix(CLASS_SUM,X.col,0,"ss");//X_1Y表示在Y下X=1的概率,反之X=0的概率爲1-
bayes.pX.initMatrix(X.col,1,0,"ss");//
int i,j,k;
for(k=0; k<bayes.pX_1Y.row; k++)
{
for(i=0; i<bayes.pX_1Y.col; i++)
{
bayes.pX_1Y.data[k][i]=1;//平滑處理,默認出現一次,後期歸一化時把特徵向量的長度也考慮進去,這裏的平滑是指每一類字典與整個字典的,未涉及測試
//樣本中的未登入詞
}
}
for(i=0; i<X.row; i++)
{
if(Y.data[i][0]==0)
{
bayes.pY.data[0][0]++;
for(j=0; j<X.col; j++)
{
bayes.pX_1Y.data[0][j]+=X.data[i][j];
}
}
else
{
bayes.pY.data[1][0]++;
for(j=0; j<X.col; j++)
{
bayes.pX_1Y.data[1][j]+=X.data[i][j];
}
}
}
for(i=0; i<X.col; i++)
{
//所有類下x各個特徵分量出現的概率
//bayes.pX.data[i][0]=(bayes.pX_1Y.data[0][i]-1) + (bayes.pX_1Y.data[1][i]-1) + 1;
//bayes.pX.data[i][0]/=bayes.pY.data[0][0] + bayes.pY.data[1][0] + 2;
//某一類下x各個特徵分量出現的概率
bayes.pX_1Y.data[0][i]/=bayes.pY.data[0][0] + 2;
bayes.pX_1Y.data[1][i]/=bayes.pY.data[1][0] + 2;
bayes.pX.data[i][0] = (bayes.pX_1Y.data[0][i] + bayes.pX_1Y.data[1][i])/2;
}
//計算出PY兩類的概率
for(k=0; k<bayes.pY.row; k++)
{
bayes.pY.data[k][0]/=X.row;
}
cout<<"pY="<<bayes.pY.data[0][0]<<endl;
for(k=0; k<bayes.pX_1Y.row; k++)
{
for(i=0; i<bayes.pX_1Y.col; i++)
{
cout<<bayes.pX_1Y.data[k][i]<<" & ";
}
cout<<"---";
}
}
詳細代碼:
https://github.com/myazi/myLearn/blob/master/Bayes.cpp
The End