朴素貝葉斯python小樣本實例


朴素貝葉斯
優點:在數據較少的情況下仍然有效,可以處理多類別問題
缺點:對於輸入數據的准備方式較為敏感
適用數據類型:標稱型數據
朴素貝葉斯決策理論的核心思想:選擇具有最高概率的決策
朴素貝葉斯的一般過程
(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)

小結:

對於分類而言,使用概率有時要比使用硬規則更為有效。貝葉斯概率及貝葉斯准則提供了一種利用已知值來估計未知概率的有效方法。

可以通過特征之間的條件獨立性假設,降低對數據量的需求。獨立性假設是指一個詞的出現概率並不依賴於文檔中的其他詞。當然我們也知道這個假設過於簡單,這就是之所以稱之為朴素貝葉斯的原因。盡管條件獨立性假設並不正確,但是朴素貝葉斯仍然是一種有效的分類器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM