標籤:類別 rds dal 向量 虛擬碼 利用 錯誤 eve 作用
樸素貝葉斯
優點:在資料較少的情況下仍然有效,可以處理多類別問題
缺點:對於輸入資料的準備方式較為敏感
適用資料類型:標稱型資料
樸素貝葉斯決策理論的核心思想:選擇具有最高機率的決策
樸素貝葉斯的一般過程
(1)收集資料:可以使用任何方法。
(2)準備資料:需要數值型或者布爾型資料。
(3)分析資料:有大量特徵時,回值特徵作用不大,此時使用長條圖效果更好
(4)訓練演算法:計算不同的獨立也正的條件機率
(5)測試演算法:計算錯誤率
(6)使用演算法:一個常見的樸素貝葉斯應用是文檔分類。可以在任意的分類情境中使用樸素貝葉斯分類器,不一定是文本
1 from numpy import * 2 3 #建立一些實驗樣本。該函數返回的第一個變數是進行詞條切分後的文檔集合, 4 #該函數返回的第二個變數是一個類別標籤的集合 5 def loadDataSet(): 6 postingList=[[‘my‘, ‘dog‘, ‘has‘, ‘flea‘, ‘problems‘, ‘help‘, ‘please‘], 7 [‘maybe‘, ‘not‘, ‘take‘, ‘him‘, ‘to‘, ‘dog‘, ‘park‘, ‘stupid‘], 8 [‘my‘, ‘dalmation‘, ‘is‘, ‘so‘, ‘cute‘, ‘I‘, ‘love‘, ‘him‘], 9 [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘], 10 [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘, ‘to‘, ‘stop‘, ‘him‘], 11 [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stupid‘]] 12 classVec = [0,1,0,1,0,1] #1 is abusive, 0 not 13 return postingList,classVec 14 15 #建立一個包含所有文檔中出現的不重複詞的列表 16 def createVocabList(dataSet): 17 #建立一個空集 18 vocabSet = set([]) #create empty set 19 for document in dataSet: 20 #建立兩個集合的並集 21 vocabSet = vocabSet | set(document) #union of the two sets 22 return list(vocabSet) 23 24 #該函數的輸入參數為詞彙表及其某個文檔,輸出的是文檔向量,向量的每一元素為1或0, 25 # 分別表示詞彙表中的單詞在輸入文檔中是否出現。 26 #函數首先建立一個和詞彙表等長的向量,並將其元素都設定為0.接著,遍曆文檔中的所有單詞, 27 # 如果出現了詞彙表中的單詞,則將輸出的文檔向量中對應值設為1.一切順利的話,就不需要 28 # 檢查某個詞是否還在vocabList中,後邊可能會用到這一操作 29 def setOfWords2Vec(vocabList, inputSet): 30 #建立一個維度都為0的向量 31 returnVec = [0]*len(vocabList) 32 for word in inputSet: 33 if word in vocabList: 34 returnVec[vocabList.index(word)] = 1 35 else: print ("the word: %s is not in my Vocabulary!" % word) 36 return returnVec 37 ‘‘‘ 38 該函數的虛擬碼如下: 39 計算每個類別中的文檔數目 40 對每篇訓練文檔: 41 對每個類別: 42 如果詞條出現文檔中則增加該詞條的計數值 43 增加所有詞條的計數值 44 對每個類別: 45 對每個詞條: 46 將該詞條的數目除以總詞條數目得到條件機率 47 返回每個類別的條件機率 48 ‘‘‘ 49 50 # 51 def trainNB0(trainMatrix,trainCategory): 52 numTrainDocs = len(trainMatrix) 53 numWords = len(trainMatrix[0]) 54 #初始化機率 55 pAbusive = sum(trainCategory)/float(numTrainDocs) 56 p0Num = ones(numWords); p1Num = ones(numWords) #change to ones() 57 p0Denom = 2.0; p1Denom = 2.0 #change to 2.0 58 for i in range(numTrainDocs): 59 #向量相加 60 if trainCategory[i] == 1: 61 p1Num += trainMatrix[i] 62 p1Denom += sum(trainMatrix[i]) 63 else: 64 p0Num += trainMatrix[i] 65 p0Denom += sum(trainMatrix[i]) 66 #對每個元素做除法 67 p1Vect = log(p1Num/p1Denom) #change to log() 68 p0Vect = log(p0Num/p0Denom) #change to log() 69 return p0Vect,p1Vect,pAbusive 70 71 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): 72 p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult 73 p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) 74 if p1 > p0: 75 return 1 76 else: 77 return 0 78 79 def bagOfWords2VecMN(vocabList, inputSet): 80 returnVec = [0]*len(vocabList) 81 for word in inputSet: 82 if word in vocabList: 83 returnVec[vocabList.index(word)] += 1 84 return returnVec 85 86 def testingNB(): 87 listOPosts,listClasses = loadDataSet() 88 myVocabList = createVocabList(listOPosts) 89 trainMat=[] 90 for postinDoc in listOPosts: 91 trainMat.append(setOfWords2Vec(myVocabList, postinDoc)) 92 p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses)) 93 testEntry = [‘love‘, ‘my‘, ‘dalmation‘] 94 thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) 95 print(testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)) 96 testEntry = [‘stupid‘, ‘garbage‘] 97 thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) 98 print (testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)) 99 #如果一個詞在文檔中出現不止依次,這可能意味著包含該詞是否出現的文檔所不能表達的某種資訊,100 # 這種方法被稱為詞袋模型。101 # #102 103 mySent=‘This book is the best book on Python or M.L. I have ever laid eyes upon.‘104 A=mySent.split()105 print(A)
小結:
對於分類而言,使用機率有時要比使用硬規則更為有效。貝葉斯機率及貝葉斯準則提供了一種利用已知值來估計未知機率的有效方法。
可以通過特徵之間的調教獨立性假設,降低對資料量的需求。獨立性假設是指一個詞的出現機率並不依賴於文檔中的其他詞。當然我們也知道這個假設過於簡單,這就是之所以稱之為樸素貝葉斯的原因。儘管條件獨立性假設並不正確,但是樸素貝葉斯仍然是一種有效分類器。
樸素貝葉斯python小樣本執行個體