樸素貝葉斯演算法
一、概念
貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。
這個定理解決了現實生活裡經常遇到的問題:已知某條件概率,如何得到兩個事件交換後的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這裡先解釋什麼是條件概率:
二、分類原理
樸素貝葉斯分類是一種十分簡單的分類演算法,叫它樸素貝葉斯分類是因為這種方法的思想真的很樸素,樸素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。
樸素貝葉斯分類的正式定義如下:
1、設x={a1,a2...am}為一個待分類項,而每個a為x的一個特徵屬性;
2、有類別集合C={y1,y2...yn};
3、計算P(y1|x),P(y2|x)...P(yn|x);
,則
那麼現在的關鍵就是如何計算第3步中的各個條件概率。我們可以這麼做:
因為分母對於所有類別為常數,因為我們只要將分子最大化皆可。又因為各特徵屬性是條件獨立的,所以有:
整個樸素貝葉斯分類分為三個階段:
第一階段——準備工作階段,這個階段的任務是為樸素貝葉斯分類做必要的準備,主要工作是根據具體情況確定特徵屬性,並對每個特徵屬性進行適當劃分,然後由人工對一部分待分類項進行分類,形成訓練樣本集合。這一階段的輸入是所有待分類資料,輸出是特徵屬性和訓練樣本。這一階段是整個樸素貝葉斯分類中唯一需要人工完成的階段,其質量對整個過程將有重要影響,分類器的質量很大程度上由特徵屬性、特徵屬性劃分及訓練樣本質量決定;
第二階段——分類器訓練階段,這個階段的任務就是生成分類器,主要工作是計算每個類別在訓練樣本中的出現頻率及每個特徵屬性劃分對每個類別的條件概率估計,並將結果記錄。其輸入是特徵屬性和訓練樣本,輸出是分類器。這一階段是機械性階段,根據前面討論的公式可以由程式自動計算完成;
第三階段——應用階段。這個階段的任務是使用分類器對待分類項進行分類,其輸入是分類器和待分類項,輸出是待分類項與類別的對映關係。這一階段也是機械性階段,由程式完成。
三、應用例項
from numpy import *
def loadDataSet():
postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0,1,0,1,0,1] #1 is abusive, 0 not
return postingList,classVec
#建立一個帶有所有單詞的列表
def createVocabList(dataSet):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
def setOfWords2Vec(vocabList, inputSet):
retVocabList = [0] * len(vocabList)
for word in inputSet:
if word in vocabList:
retVocabList[vocabList.index(word)] = 1
else:
print ('word ',word ,'not in dict')
return retVocabList
#另一種模型
def bagOfWords2VecMN(vocabList, inputSet):
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] += 1
return returnVec
def trainNB0(trainMatrix,trainCatergory):
numTrainDoc = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCatergory)/float(numTrainDoc)
#防止多個概率的成績當中的一個為0
p0Num = ones(numWords)
p1Num = ones(numWords)
p0Denom = 2.0
p1Denom = 2.0
for i in range(numTrainDoc):
if trainCatergory[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
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0
def testingNB():
listOPosts,listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
trainMat=[]
for postinDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
testEntry = ['love', 'my', 'dalmation']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print (testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb))
testEntry = ['stupid', 'garbage']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print (testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb))
def main():
testingNB()
if __name__ == '__main__':
main()
結果:
['love', 'my', 'dalmation'] classified as: 0
['stupid', 'garbage'] classified as: 1
相關文章
- 樸素貝葉斯模型模型
- 分類演算法-樸素貝葉斯演算法
- 04_樸素貝葉斯演算法演算法
- ML-樸素貝葉斯
- 樸素貝葉斯分類
- 樸素貝葉斯和半樸素貝葉斯(AODE)分類器Python實現Python
- 樸素貝葉斯與Laplace平滑
- 樸素貝葉斯—印第安人
- 樸素貝葉斯/SVM文字分類文字分類
- 樸素貝葉斯演算法的實現與推理演算法
- 監督學習之樸素貝葉斯
- 樸素貝葉斯實現文件分類
- 簡單易懂的樸素貝葉斯分類演算法演算法
- Python機器學習 — 樸素貝葉斯演算法(Naive Bayes)Python機器學習演算法AI
- Python機器學習筆記:樸素貝葉斯演算法Python機器學習筆記演算法
- 機器學習演算法(二): 樸素貝葉斯(Naive Bayes)機器學習演算法AI
- 樸素貝葉斯分類流程圖介紹流程圖
- 使用樸素貝葉斯過濾垃圾郵件
- Sklearn中的樸素貝葉斯分類器`
- 樸素貝葉斯--新浪新聞分類例項
- 機器學習之樸素貝葉斯分類機器學習
- [譯] Sklearn 中的樸素貝葉斯分類器
- HanLP-樸素貝葉斯分類預測缺陷HanLP
- 機器學習Sklearn系列:(四)樸素貝葉斯機器學習
- 演算法金 | AI 基石,無處不在的樸素貝葉斯演算法演算法AI
- 機器學習經典演算法之樸素貝葉斯分類機器學習演算法
- (實戰)樸素貝葉斯實現垃圾分類_201121
- 樸素貝葉斯分類和預測演算法的原理及實現演算法
- 《統計學習方法》——樸素貝葉斯程式碼實現
- 樸素貝葉斯入門例項之就是這麼簡單
- 100天搞定機器學習|Day15 樸素貝葉斯機器學習
- 資料探勘從入門到放棄(三):樸素貝葉斯
- 詳解樸素貝葉斯的來源,原理以及例項解析
- 有監督學習——支援向量機、樸素貝葉斯分類
- 第7章 基於樸素貝葉斯的垃圾郵件分類
- 樸素貝葉斯深度解碼:從原理到深度學習應用深度學習
- 樸素貝葉斯:幫助AI產品經理“小步快跑,快速迭代”AI
- 樸素貝葉斯分類-實戰篇-如何進行文字分類文字分類