1. 程式人生 > >十大演算法之樸素貝葉斯

十大演算法之樸素貝葉斯

1.條件概率

這裡寫圖片描述
這個符號代表的意思是在類別Ci的條件下,出現某個由x,y組成的資料點的概率。

2.貝葉斯公式

這裡寫圖片描述
這個準則的目的是求當知道某個點的條件下,判斷他屬於哪個類別的條件概率。

3.貝葉斯準則進行分類

假設資料點(x,y)可能分成C1,C2類,使用上述的貝葉斯公式進行類別的判斷。那麼定義貝葉斯準則為:
如果P(C1|x,y)>P(C2|x,y),那麼該點屬於類別C1
如果P(C1|x,y)

4.樸素貝葉斯

即假設每個樣本中的特徵出現的可能性相互獨立。那麼對於多特徵的問題計算條件概率的時候,可以利用以下公式來計算條件概率:
P(x,y,z|C1)=P(x|C1)* P(y|C1) * P(z|C1)

5.下面通過以下詞向量分類的例子說明樸素配葉斯分類的原理

這裡寫圖片描述
這裡w代表一個詞向量,這個詞向量有多個特徵(w0,w1,w2,…wn),ci是這個詞向量的分類。這裡假設所有的特徵詞彙都是獨立的,那麼在計算p(w0,w1,w2…wn|ci)就可以用p(w0|ci) * p(w1|ci)…p(wn|ci)來代替,這就是樸素貝葉斯的原理。
測試詞條轉化成向量:
轉化出來的向量每個元素代表詞彙表中的單詞是否出現在該詞條中,若出現,則對應元素為1,否則,對應元素為0

def setOfWords2Vec(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for
word in inputSet: if word in vocabList: returnVec[vocabList.index(word)]=1 else:print "the word:%s is not in my Vocabulary!" % word return returnVec

訓練貝葉斯分類器:
這裡注意了,每個詞彙表都相當於一個貝葉斯模型,不同的詞彙表會輸入不同的trainMatrix,trainCategory引數,從而在訓練的結果會出現不同的p0Vect,p1Vect,pAbusive。

#train
def trainNB0(trainMatrix,trainCategory): numTrainDocs=len(trainMatrix) numWords=len(trainMatrix[0]) pAbusive=sum(trainCategory)/float(numTrainDocs)#計算出該文件中出現侮辱性詞彙的先驗概率 p0Num=ones(numWords) p1Num=ones(numWords) p0Denom=2.0 p1Denom=2.0 for i in range(numTrainDocs): ##以下這個過程就是條件概率實踐方法 if trainCategory[i]==1: p1Num+=trainMatrix[i]#對侮辱性文件的每個詞彙的數量統計 p1Denom+=sum(trainMatrix[i])#侮辱性文件的詞彙總數 else: p0Num+=trainMatrix[i]#對非侮辱性文件的每個詞彙的數量統計 p0Denom+=sum(trainMatrix[i])#非侮辱性文件的詞彙總數 p1Vect=log(p1Num/p1Denom) p0Vect=log(p0Num/p0Denom) return p0Vect,p1Vect,pAbusive

測試分類器:
在classifyNB()函式中,以p(ci,w)代替p(ci|w)來最終判斷w的類別,可能是因為在這個分詞的背景下,這兩個概率是等價的(這個僅僅是我個人的理解)

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
##以下加號的左邊是將所有的log相加,就是將所有出現在測試詞條的屬性的條件概率相乘,最後得出總體的條件概率,右邊是類別取對數
    p1=sum(vec2Classify*p1Vec)+log(pClass1)
    p0=sum(vec2Classify*p0Vec)+log(1-pClass1)
    if p1 > p0:
        return 1
    else:
        return 0
#這裡太簡單,不做解釋
def testingNB():
    lsitOPosts,listClasses=loadDataSet()
    myVocabList=createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts: 
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
    p0V,p1V,pAb=trainNB0(trainMat,listClasses)
    testEntry=['love','my','dalmation']
    thisDoc=setOfWords2Vec(myVocabList,testEntry)
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry=['stupid','garbage']
    thisDoc=setOfWords2Vec(myVocabList,testEntry)
    print testEntry,'Classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

6.交叉驗證

就是將一個數據集一部分作為訓練集,一部分作為測試集合。訓練集和測試集不能有交集。

7.以上的一些註釋都是對《機器學習實踐》一書中第4章貝葉斯演算法的一些比較難懂的地方的一下個人理解。