樸素貝葉斯概述
樸素貝葉斯是一種簡(jiǎn)單但功能驚人的預(yù)測(cè)建模算法驹沿。
該模型由兩種可以直接從訓(xùn)練數(shù)據(jù)中計(jì)算的概率組成: 1) 每個(gè)類的概率; 2) 給定每個(gè)x值后每個(gè)類的條件概率客税。 一旦計(jì)算出概率模型况褪,就可以用貝葉斯定理對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。當(dāng)你的數(shù)據(jù)是實(shí)值時(shí)更耻,通常假設(shè)一個(gè)高斯分布(鐘形曲線)测垛,這樣你就可以很容易地估計(jì)這些概率。
樸素貝葉斯之所以稱“樸素”秧均,是因?yàn)樗僭O(shè)每個(gè)輸入變量是獨(dú)立的食侮。這對(duì)于真實(shí)數(shù)據(jù)來(lái)說(shuō)是一個(gè)很強(qiáng)的、不切實(shí)際的假設(shè)目胡,然而锯七,該技術(shù)對(duì)于大量復(fù)雜問(wèn)題非常有效。
舉個(gè)在 NLP (Natural Language Processing)的應(yīng)用
給一段文字誉己,返回情感分類眉尸,這段文字的態(tài)度是positive,還是negative巨双。
為了解決這個(gè)問(wèn)題噪猾,可以只看其中的一些單詞。
這段文字筑累,將僅由一些單詞和它們的計(jì)數(shù)代表袱蜡。
原始問(wèn)題是:給你一句話,它屬于哪一類慢宗,
通過(guò) bayes rules 變成一個(gè)比較簡(jiǎn)單容易求得的問(wèn)題坪蚁。
問(wèn)題變成,這一類中這句話出現(xiàn)的概率是多少镜沽,當(dāng)然敏晤,別忘了公式里的另外兩個(gè)概率。
栗子:?jiǎn)卧~ love 在 positive 的情況下出現(xiàn)的概率是 0.1缅茉,在 negative 的情況下出現(xiàn)的概率是 0.001茵典。
樸素貝葉斯分類算法案例
大體計(jì)算方法:
P(好評(píng) | 單詞1,單詞2宾舅,單詞3) = P(單詞1统阿,單詞2彩倚,單詞3 | 好評(píng)) * P(好評(píng)) / P(單詞1,單詞2扶平,單詞3)
因?yàn)榉帜付枷嗤耄灾挥帽容^分子即可--->P(單詞1,單詞2结澄,單詞3 | 好評(píng)) P(好評(píng))
每個(gè)單詞之間都是相互獨(dú)立的---->P(單詞1 | 好評(píng))P(單詞2 | 好評(píng))P(單詞3 | 好評(píng))*P(好評(píng))
P(單詞1 | 好評(píng)) = 單詞1在樣本好評(píng)中出現(xiàn)的總次數(shù)/樣本好評(píng)句子中總的單詞數(shù)
P(好評(píng)) = 樣本好評(píng)的條數(shù)/樣本的總條數(shù)
同理:
P(差評(píng) | 單詞1哥谷,單詞2,單詞3) = P(單詞1麻献,單詞2们妥,單詞3 | 差評(píng)) * P(差評(píng)) / P(單詞1,單詞2勉吻,單詞3)
因?yàn)榉帜付枷嗤嗌簦灾挥帽容^分子即可--->P(單詞1,單詞2齿桃,單詞3 | 差評(píng)) P(差評(píng))
每個(gè)單詞之間都是相互獨(dú)立的---->P(單詞1 | 差評(píng))P(單詞2 | 差評(píng))P(單詞3 | 差評(píng))*P(差評(píng))
#!/usr/bin/python
# coding=utf-8
from numpy import *
# 過(guò)濾網(wǎng)站的惡意留言 侮辱性:1 非侮辱性:0
# 創(chuàng)建一個(gè)實(shí)驗(yàn)樣本
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]
return postingList, classVec
# 創(chuàng)建一個(gè)包含在所有文檔中出現(xiàn)的不重復(fù)詞的列表
def createVocabList(dataSet):
vocabSet = set([]) # 創(chuàng)建一個(gè)空集
for document in dataSet:
vocabSet = vocabSet | set(document) # 創(chuàng)建兩個(gè)集合的并集
return list(vocabSet)
# 將文檔詞條轉(zhuǎn)換成詞向量
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0]*len(vocabList) # 創(chuàng)建一個(gè)其中所含元素都為0的向量
for word in inputSet:
if word in vocabList:
# returnVec[vocabList.index(word)] = 1 # index函數(shù)在字符串里找到字符第一次出現(xiàn)的位置 詞集模型
returnVec[vocabList.index(word)] += 1 # 文檔的詞袋模型 每個(gè)單詞可以出現(xiàn)多次
else: print("the word: %s is not in my Vocabulary!" % word)
return returnVec
# 樸素貝葉斯分類器訓(xùn)練函數(shù) 從詞向量計(jì)算概率
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
# p0Num = zeros(numWords); p1Num = zeros(numWords)
# p0Denom = 0.0; p1Denom = 0.0
p0Num = ones(numWords); # 避免一個(gè)概率值為0,最后的乘積也為0
p1Num = ones(numWords); # 用來(lái)統(tǒng)計(jì)兩類數(shù)據(jù)中惑惶,各詞的詞頻
p0Denom = 2.0; # 用于統(tǒng)計(jì)0類中的總數(shù)
p1Denom = 2.0 # 用于統(tǒng)計(jì)1類中的總數(shù)
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 = p1Num / p1Denom
# p0Vect = p0Num / p0Denom
p1Vect = log(p1Num / p1Denom) # 在類1中,每個(gè)次的發(fā)生概率
p0Vect = log(p0Num / p0Denom) # 避免下溢出或者浮點(diǎn)數(shù)舍入導(dǎo)致的錯(cuò)誤 下溢出是由太多很小的數(shù)相乘得到的
return p0Vect, p1Vect, pAbusive
# 樸素貝葉斯分類器
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify*p1Vec) + log(pClass1)
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))
# 調(diào)用測(cè)試方法----------------------------------------------------------------------
testingNB()
運(yùn)行結(jié)果:
樸素貝葉斯算法小結(jié)
樸素貝葉斯算法的主要原理基本已經(jīng)做了總結(jié)短纵,這里對(duì)樸素貝葉斯的優(yōu)缺點(diǎn)做一個(gè)總結(jié)带污。
樸素貝葉斯的主要優(yōu)點(diǎn)有:
- 1)樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有穩(wěn)定的分類效率香到。
- 2)對(duì)小規(guī)模的數(shù)據(jù)表現(xiàn)很好鱼冀,能個(gè)處理多分類任務(wù),適合增量式訓(xùn)練悠就,尤其是數(shù)據(jù)量超出內(nèi)存時(shí)千绪,我們可以一批批的去增量訓(xùn)練。
- 3)對(duì)缺失數(shù)據(jù)不太敏感理卑,算法也比較簡(jiǎn)單翘紊,常用于文本分類蔽氨。
樸素貝葉斯的主要缺點(diǎn)有:
- 1) 理論上藐唠,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實(shí)際上并非總是如此鹉究,這是因?yàn)闃闼刎惾~斯模型給定輸出類別的情況下,假設(shè)屬性之間相互獨(dú)立宇立,這個(gè)假設(shè)在實(shí)際應(yīng)用中往往是不成立的,在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí)自赔,分類效果不好妈嘹。而在屬性相關(guān)性較小時(shí),樸素貝葉斯性能最為良好绍妨。對(duì)于這一點(diǎn)润脸,有半樸素貝葉斯之類的算法通過(guò)考慮部分關(guān)聯(lián)性適度改進(jìn)柬脸。
- 2)需要知道先驗(yàn)概率,且先驗(yàn)概率很多時(shí)候取決于假設(shè)毙驯,假設(shè)的模型可以有很多種倒堕,因此在某些時(shí)候會(huì)由于假設(shè)的先驗(yàn)?zāi)P偷脑驅(qū)е骂A(yù)測(cè)效果不佳。
- 3)由于我們是通過(guò)先驗(yàn)和數(shù)據(jù)來(lái)決定后驗(yàn)的概率從而決定分類爆价,所以分類決策存在一定的錯(cuò)誤率垦巴。
- 4)對(duì)輸入數(shù)據(jù)的表達(dá)形式很敏感。
以上就是樸素貝葉斯算法的一個(gè)總結(jié)铭段,希望可以幫到朋友們骤宣。