- 簽證留學(xué) |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語 |
- 德語
我們將使用上述公式,對每個類計算該值,然后比較這兩個概率值的大小。如何計算呢?首先可以通過類別i(侮辱性留言或非侮辱性留言)中文檔數(shù)除以總的文檔數(shù)來計算概率p(ci)。接下來計算p(w|ci),這里就要用到樸素貝葉斯假設(shè)。如果將w展開為一個個獨立特征,那么就可以將上述概率寫作p(w0,w1,w2,wN|ci)。這里假設(shè)所有詞都互相獨立,該假設(shè)也稱作條件獨立性假設(shè),它意味著可以使用p(w0|ci)p(w1lci)p(w2lci)...p(wN|ci)來計算上述概率,這就極大地簡化了計算的過程。
該函數(shù)的偽代碼如下:
計算每個類別中的文檔數(shù)目
對每篇訓(xùn)練文檔:
對每個類別:
如果詞條出現(xiàn)文檔中→增加該詞條的計數(shù)值
增加所有詞條的計數(shù)值
對每個類別:
對每個詞條:
將該詞條的數(shù)目除以總詞條數(shù)目得到條件概率
返回每個類別的條件概率
我們利用下面的代碼來實現(xiàn)上述偽碼。打開文本編輯器,將這些代碼添加到bayes.py文件中。該函數(shù)使用了NumPy的一些函數(shù),故應(yīng)確保將from numpy import*語句添加到bayes.py文件的最前面。
程序清單1-2樸素貝葉斯分類器訓(xùn)練函數(shù)
代碼函數(shù)中的輸入?yún)?shù)為文檔矩陣trainMatrix,以及由每篇文檔類別標(biāo)簽所構(gòu)成的向量trainCategory。首先,計算文檔屬于侮辱性文檔(class=1)的概率,即p(1)。因為這是一個二類分類問題,所以可以通過1-P(1)得到P(0)。對于多于兩類的分類問題,則需要對代碼稍加修改。
計算p(wilc1)和p(wi|c0),需要初始化程序中的分子變量和分母變量①。由于w中元素如此眾多,因此可以使用NumPy數(shù)組快速計算這些值。上述程序中的分母變量是一個元素個數(shù)等于詞匯表大小的NumPy數(shù)組。在for循環(huán)中,要遍歷訓(xùn)練集trainMatrix中的所有文檔。一旦某個詞語(侮辱性或正常詞語)在某一文檔中出現(xiàn),則該詞對應(yīng)的個數(shù)(p1Num或者pONum)就加1,而且在所有的文檔中,該文檔的總詞數(shù)也相應(yīng)加1②。對于兩個類別都要進(jìn)行同樣的計算處理。
最后,對每個元素除以該類別中的總詞數(shù)③。利用NymPy可以很好實現(xiàn),用一個數(shù)組除以浮點數(shù)即可,若使用常規(guī)的Python列表則難以完成這種任務(wù),讀者可以自己嘗試一下。最后,函數(shù)會返回兩個向量和一個概率。
接下來試驗一下。將程序清單1-2中的代碼添加到bayes.py文件中,在Python提示符下輸入:
>>> from numpy import*
>>> reload(bayes)
>>> listOPosts, listClasses = bayes.loadDataSet ()
該語句從預(yù)先加載值中調(diào)入數(shù)據(jù)。
>>>myvocabList = bayes.createVocabList(listOPosts)
至此我們構(gòu)建了一個包含所有詞的列表myVocabList。
>>> trainMat=[ ]
>>> for postinDoc in listOPosts:
>>>trainMat.append (bayes.setOfWords2Vec (myVocabList, postinDoc))
該for循環(huán)使用詞向量來填充trainMat列表。下面給出屬于侮辱性文檔的概率以及兩個類別的概率向量。
>>> p0V,p1V,pAb=bayes.trainNB0 (trainMat,listClasses)
接下來看這些變量的內(nèi)部值:
>>> pAb
0.5
這就是任意文檔屬于侮辱性文檔的概率。
首先,我們發(fā)現(xiàn)文檔屬于侮辱類的概率pAb為0.5,該值是正確的。接下來,看一看在給定文檔類別條件下詞匯表中單詞的出現(xiàn)概率,看看是否正確。詞匯表中的第一個詞是cute,其在類別0中出現(xiàn)1次,而在類別1中從未出現(xiàn)。對應(yīng)的條件概率分別為0.04166667與0.0。該計算是正確的。我們找找所有概率中的最大值,該值出現(xiàn)在P(1)數(shù)組第21個下標(biāo)位置,大小為0.15789474。在myVocabList的第26個下標(biāo)位置上可以查到該單詞是stupid。這意味著stupid是最能表征類別1(侮辱性文檔類)的單詞。
使用該函數(shù)進(jìn)行分類之前,還需解決函數(shù)中的一些缺陷。