【机器学习】朴素贝叶斯
跟著博主的腳步,每天進步一點點
本文介紹了樸素貝葉斯模型,樸素貝葉斯(幾乎所有的概率模型)的核心假設:特征之間的條件概率相互獨立。以垃圾郵件分類問題為例,分析了樸素貝葉斯模型的兩種應用場景: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
來和小伙伴們一起向上生長呀!
掃描下方二維碼,添加小詹微信,可領取千元大禮包并申請加入 Python 學習交流群,群內僅供學術交流,日?;?#xff0c;如果是想發推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!
????長按識別,添加微信
(添加人數較多,請耐心等待)
????長按識別,關注小詹
(掃碼回復 1024 領取程序員大禮包)
總結
以上是生活随笔為你收集整理的【机器学习】朴素贝叶斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你见过的最全面的 Python 重点
- 下一篇: 【机器学习】高斯判别分析