朴素贝叶斯模型简单理解
小白一個(gè),如果有問(wèn)題歡迎大家指正。
?
?
樸素貝葉斯法
樸素貝葉斯法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類方法。對(duì)于給定的訓(xùn)練數(shù)據(jù)集,首先基于特征條件獨(dú)立假設(shè)學(xué)習(xí)輸入\輸出的聯(lián)合概率分布;然后基于此模型,對(duì)給定的輸入x,利用貝葉斯定理求出后驗(yàn)概率最大的輸出y。這里可以舉個(gè)例子,就好比醫(yī)生在幫病人看病的時(shí)候,病人手里的化驗(yàn)單以及各種檢測(cè)證明(假設(shè)證明之間相互獨(dú)立),就是特征條件,醫(yī)生就好比是一個(gè)分類器,輸入了一堆特征條件x,然后進(jìn)行判斷病人具體得的是什么病也就是P(y|x)概率最大的那個(gè),并且這個(gè)醫(yī)生診斷的準(zhǔn)確率,與他當(dāng)初受到的教育方式(構(gòu)造方法)、病人的癥狀是否突出(待分類數(shù)據(jù)的特性)以及醫(yī)生的經(jīng)驗(yàn)多少(訓(xùn)練樣本數(shù)量)都有密切關(guān)系。這個(gè)過(guò)程就是分類的過(guò)程。
這里先給出幾個(gè)概率的公式,讓大家回憶一下,后續(xù)會(huì)用到。
條件概率:? ? ? ?? ? ? ? ? ? ? ? ? ? P(B)為先驗(yàn)概率,P(A|B)為后驗(yàn)概率,P(AB)為聯(lián)合概率
全概率:? ? ? ? ?
貝葉斯公式:?
這里給一道貝葉斯公式的例題
Q:8支步槍中有5支已校準(zhǔn)過(guò),3支未校準(zhǔn)。一個(gè)射手用校準(zhǔn)過(guò)的槍射擊,中靶概率為0.8,用未校準(zhǔn)過(guò)的槍射擊,中靶概率為0.3,現(xiàn)從8支槍中隨機(jī)取一支射擊,結(jié)果中靶。求該槍是已校準(zhǔn)過(guò)的概率。
A:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
?
OK,那么現(xiàn)在開(kāi)始樸素貝葉斯的學(xué)習(xí)。首先要給出兩個(gè)樸素貝葉斯的假設(shè)。
1、一個(gè)特征的出現(xiàn)的概率,與其他特征(條件)獨(dú)立,其實(shí)也就是說(shuō)對(duì)于給定分類的條件下,特征獨(dú)立。
2、每一個(gè)特征同等重要(特征均衡性)
?
那么在這個(gè)假設(shè)的情況下,我們回過(guò)頭來(lái)去看看貝葉斯公式,將會(huì)有新的發(fā)現(xiàn)(我感覺(jué)信息量巨大的發(fā)現(xiàn)。。。)
貝葉斯公式帶來(lái)的一些思考?
在給定某些樣本D的時(shí)候,在這些樣本中計(jì)算某些結(jié)論出現(xiàn)的概率,即
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
第一個(gè)等式:貝葉斯公式
第二個(gè)等式:樣本給定的情況下,則對(duì)于任何的Ai,P(D)是常數(shù),僅僅只是一個(gè)歸一化因子,所以可以去掉。
第三個(gè)箭頭:若這些結(jié)論的先驗(yàn)概率相等或者相近似,則得到最后一個(gè)等式。也就是可以理解為Ai的分布是均勻分布,這估計(jì)也是樸素貝葉斯的第二個(gè)假設(shè)的原因。
總結(jié):在已知樣本D的時(shí)候,我們想要知道最有可能是哪一個(gè)結(jié)論到時(shí)候(也就是輸入一個(gè)x,我們想要知道它的分類),我們通常不是計(jì)算,而是去計(jì)算。后面的那個(gè)概率其實(shí)就是極大似然估計(jì)了,因?yàn)槲覀冎癓R模型或者線性回歸里面,我們?nèi)ス烙?jì)參數(shù)的時(shí)候,都是假定參數(shù)是同等重要的,然后在此前提下去找到Ai使得分割面或者分割線,使得數(shù)據(jù)得到最大。所以,極大似然估計(jì)里面先驗(yàn)的假定了Ai是相同的。
這里換一種簡(jiǎn)單的方式說(shuō)明邏輯回歸和樸素貝葉斯之間的關(guān)系。
假設(shè)是一個(gè)二分類問(wèn)題,并且存在三個(gè)特征X1,X2,X3。
那么
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
所以分類的最終目的就在于,,便可以說(shuō)明Y=1的概率比Y=0的概率更大。所以兩個(gè)概率相除,得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
但是,由于概率值域是[0,1],相乘和相除容易產(chǎn)生過(guò)小的數(shù)值,導(dǎo)致編程下溢問(wèn)題,所以兩邊取對(duì)數(shù)得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
對(duì)于樸素貝葉斯而言,由于之前提過(guò)的,樸素貝葉斯當(dāng)中有個(gè)強(qiáng)假設(shè),就是條件獨(dú)立假設(shè),每個(gè)條件之間沒(méi)有耦合,相互獨(dú)立。所以對(duì)數(shù)可以進(jìn)一步拆分成
? ? ? ? ? ? ? ? ?
對(duì)于邏輯回歸而言,是用線性模型的預(yù)測(cè)結(jié)果取逼近這個(gè)后驗(yàn)概率的比值,也就是
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
此時(shí),我們就可以發(fā)現(xiàn)兩者的表達(dá)式是多么的相似。但是二者的區(qū)別就是在于,用了兩種不同的方法求出來(lái)權(quán)重是不一樣的。產(chǎn)生差別的原因就是在于之前樸素貝葉斯之中有一個(gè)強(qiáng)假設(shè)(條件獨(dú)立性假設(shè)),因?yàn)檫@個(gè)強(qiáng)假設(shè)所以樸素貝葉斯不需要梯度下降直接通過(guò)統(tǒng)計(jì)每個(gè)特征的后驗(yàn)概率來(lái)當(dāng)做權(quán)重,而邏輯回歸,條件獨(dú)立假設(shè)不成立,所以通過(guò)梯度下降法,可以得到特征之間的耦合信息,從而得到相應(yīng)的權(quán)重。
?
?
鋪墊了這么多,現(xiàn)在開(kāi)始通過(guò)一個(gè)文本分類的例子,了解樸素貝葉斯。
樣本有10000封郵件,每個(gè)郵件被標(biāo)記為垃圾郵件或者非垃圾郵件,目標(biāo)是確定未知的郵件是垃圾郵件還是非垃圾郵件。
首先,這是一個(gè)二分類問(wèn)題,假設(shè)類別c:垃圾郵件c1,非垃圾郵件c2。之后我們需要進(jìn)行統(tǒng)計(jì)里面的單詞,且每個(gè)單詞出現(xiàn)了幾次,相當(dāng)于是建立一個(gè)詞匯表。建立詞匯表有兩種方法。
1、可以使用現(xiàn)成的單詞詞典,可以包含大量的單詞;
2、可以將所有郵件中出現(xiàn)的單詞全部統(tǒng)計(jì)出來(lái),得到詞典。
我們記錄單詞的數(shù)目為N。那么就可以將每個(gè)郵件m映射成一個(gè)維度為N的向量x。若單詞在郵件m中出現(xiàn)過(guò),則=1,否則,=0。即郵件可以全部向量化。(也可以記錄頻數(shù))。
然后根據(jù)貝葉斯公式:
注意這里x是向量。由于我們之前進(jìn)行強(qiáng)假設(shè),特征之間是相互獨(dú)立的,所以,P(x|c)可以進(jìn)行拆分。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
帶回之前的公式就可以求出P(c|x),包含x特征的郵件是屬于哪一類郵件。順便提一句,公式右邊都是可以通過(guò)統(tǒng)計(jì)求出具體的值,因?yàn)楦鶕?jù)大數(shù)定理,當(dāng)樣本足夠大的時(shí)候,我們可以認(rèn)為統(tǒng)計(jì)的比例近似于概率。
在這里寫下右邊各項(xiàng)的含義。
: 在(此題目,要么是垃圾郵件,要么是非垃圾郵件)的前提下,第i個(gè)單詞出現(xiàn)的概率(頻率)。
:在所有樣本中,單詞出現(xiàn)的概率(頻率)。
:在所有樣本中,郵件類別出現(xiàn)的概率(頻率)。
所以,舉個(gè)例子,比如“我司可辦理正規(guī)發(fā)票(保真)17%增值稅發(fā)票點(diǎn)數(shù)優(yōu)惠!”這一句話,我們需要判斷出現(xiàn)這句話的郵件,是不是垃圾郵件,就是要看在垃圾郵件中,出現(xiàn)這些詞的次數(shù),然后根據(jù)大數(shù)定理,我們假定頻率就代表著概率,就比如P(“發(fā)票”|c=c1(垃圾郵件))=(垃圾郵件中所有"發(fā)票"的次數(shù))/(垃圾郵件中所有詞的次數(shù))。由于并行的計(jì)算,所以我們工業(yè)界進(jìn)行詞匯統(tǒng)計(jì)是很快的。
?
這里給個(gè)代碼(不是分類垃圾郵件的,是Mnist數(shù)字識(shí)別的,超級(jí)無(wú)敵的詳細(xì),每行基本上都有注釋,感謝大佬寫的代碼,鏈接我放在了后面)
# coding=utf-8 # Author:Dodo # Date:2018-11-17 # Email:lvtengchao@pku.edu.cn''' 數(shù)據(jù)集:Mnist 訓(xùn)練集數(shù)量:60000 測(cè)試集數(shù)量:10000 ------------------------------ 運(yùn)行結(jié)果:正確率:84.3%運(yùn)行時(shí)長(zhǎng):103s '''import numpy as np import timedef loadData(fileName):'''加載文件:param fileName:要加載的文件路徑:return: 數(shù)據(jù)集和標(biāo)簽集'''#存放數(shù)據(jù)及標(biāo)記dataArr = []; labelArr = []#讀取文件fr = open(fileName)#遍歷文件中的每一行for line in fr.readlines():#獲取當(dāng)前行,并按“,”切割成字段放入列表中#strip:去掉每行字符串首尾指定的字符(默認(rèn)空格或換行符)#split:按照指定的字符將字符串切割成每個(gè)字段,返回列表形式curLine = line.strip().split(',')#將每行中除標(biāo)記外的數(shù)據(jù)放入數(shù)據(jù)集中(curLine[0]為標(biāo)記信息)#在放入的同時(shí)將原先字符串形式的數(shù)據(jù)轉(zhuǎn)換為整型#此外將數(shù)據(jù)進(jìn)行了二值化處理,大于128的轉(zhuǎn)換成1,小于的轉(zhuǎn)換成0,方便后續(xù)計(jì)算dataArr.append([int(int(num) > 128) for num in curLine[1:]])#將標(biāo)記信息放入標(biāo)記集中#放入的同時(shí)將標(biāo)記轉(zhuǎn)換為整型labelArr.append(int(curLine[0]))#返回?cái)?shù)據(jù)集和標(biāo)記return dataArr, labelArrdef NaiveBayes(Py, Px_y, x):'''通過(guò)樸素貝葉斯進(jìn)行概率估計(jì):param Py: 先驗(yàn)概率分布:param Px_y: 條件概率分布:param x: 要估計(jì)的樣本x:return: 返回所有l(wèi)abel的估計(jì)概率'''#設(shè)置特征數(shù)目featrueNum = 784#設(shè)置類別數(shù)目classNum = 10#建立存放所有標(biāo)記的估計(jì)概率數(shù)組P = [0] * classNum#對(duì)于每一個(gè)類別,單獨(dú)估計(jì)其概率for i in range(classNum):#初始化sum為0,sum為求和項(xiàng)。#在訓(xùn)練過(guò)程中對(duì)概率進(jìn)行了log處理,所以這里原先應(yīng)當(dāng)是連乘所有概率,最后比較哪個(gè)概率最大#但是當(dāng)使用log處理時(shí),連乘變成了累加,所以使用sumsum = 0#獲取每一個(gè)條件概率值,進(jìn)行累加for j in range(featrueNum):sum += Px_y[i][j][x[j]]#最后再和先驗(yàn)概率相加(也就是式4.7中的先驗(yàn)概率乘以后頭那些東西,乘法因?yàn)閘og全變成了加法)P[i] = sum + Py[i]#max(P):找到概率最大值#P.index(max(P)):找到該概率最大值對(duì)應(yīng)的所有(索引值和標(biāo)簽值相等)return P.index(max(P))def model_test(Py, Px_y, testDataArr, testLabelArr):'''對(duì)測(cè)試集進(jìn)行測(cè)試:param Py: 先驗(yàn)概率分布:param Px_y: 條件概率分布:param testDataArr: 測(cè)試集數(shù)據(jù):param testLabelArr: 測(cè)試集標(biāo)記:return: 準(zhǔn)確率'''#錯(cuò)誤值計(jì)數(shù)errorCnt = 0#循環(huán)遍歷測(cè)試集中的每一個(gè)樣本for i in range(len(testDataArr)):#獲取預(yù)測(cè)值presict = NaiveBayes(Py, Px_y, testDataArr[i])#與答案進(jìn)行比較if presict != testLabelArr[i]:#若錯(cuò)誤 錯(cuò)誤值計(jì)數(shù)加1errorCnt += 1#返回準(zhǔn)確率return 1 - (errorCnt / len(testDataArr))def getAllProbability(trainDataArr, trainLabelArr):'''通過(guò)訓(xùn)練集計(jì)算先驗(yàn)概率分布和條件概率分布:param trainDataArr: 訓(xùn)練數(shù)據(jù)集:param trainLabelArr: 訓(xùn)練標(biāo)記集:return: 先驗(yàn)概率分布和條件概率分布'''#設(shè)置樣本特診數(shù)目,數(shù)據(jù)集中手寫圖片為28*28,轉(zhuǎn)換為向量是784維。# (我們的數(shù)據(jù)集已經(jīng)從圖像轉(zhuǎn)換成784維的形式了,CSV格式內(nèi)就是)featureNum = 784#設(shè)置類別數(shù)目,0-9共十個(gè)類別classNum = 10#初始化先驗(yàn)概率分布存放數(shù)組,后續(xù)計(jì)算得到的P(Y = 0)放在Py[0]中,以此類推#數(shù)據(jù)長(zhǎng)度為10行1列Py = np.zeros((classNum, 1))#對(duì)每個(gè)類別進(jìn)行一次循環(huán),分別計(jì)算它們的先驗(yàn)概率分布#計(jì)算公式為書中"4.2節(jié) 樸素貝葉斯法的參數(shù)估計(jì) 公式4.8"for i in range(classNum):#下方式子拆開(kāi)分析#np.mat(trainLabelArr) == i:將標(biāo)簽轉(zhuǎn)換為矩陣形式,里面的每一位與i比較,若相等,該位變?yōu)門ure,反之False#np.sum(np.mat(trainLabelArr) == i):計(jì)算上一步得到的矩陣中Ture的個(gè)數(shù),進(jìn)行求和(直觀上就是找所有l(wèi)abel中有多少個(gè)#為i的標(biāo)記,求得4.8式P(Y = Ck)中的分子)#np.sum(np.mat(trainLabelArr) == i)) + 1:參考“4.2.3節(jié) 貝葉斯估計(jì)”,例如若數(shù)據(jù)集總不存在y=1的標(biāo)記,也就是說(shuō)#手寫數(shù)據(jù)集中沒(méi)有1這張圖,那么如果不加1,由于沒(méi)有y=1,所以分子就會(huì)變成0,那么在最后求后驗(yàn)概率時(shí)這一項(xiàng)就變成了0,再#和條件概率乘,結(jié)果同樣為0,不允許存在這種情況,所以分子加1,分母加上K(K為標(biāo)簽可取的值數(shù)量,這里有10個(gè)數(shù),取值為10)#參考公式4.11#(len(trainLabelArr) + 10):標(biāo)簽集的總長(zhǎng)度+10.#((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10):最后求得的先驗(yàn)概率Py[i] = ((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10)#轉(zhuǎn)換為log對(duì)數(shù)形式#log書中沒(méi)有寫到,但是實(shí)際中需要考慮到,原因是這樣:#最后求后驗(yàn)概率估計(jì)的時(shí)候,形式是各項(xiàng)的相乘(“4.1 樸素貝葉斯法的學(xué)習(xí)” 式4.7),這里存在兩個(gè)問(wèn)題:1.某一項(xiàng)為0時(shí),結(jié)果為0.#這個(gè)問(wèn)題通過(guò)分子和分母加上一個(gè)相應(yīng)的數(shù)可以排除,前面已經(jīng)做好了處理。2.如果特診特別多(例如在這里,需要連乘的項(xiàng)目有784個(gè)特征#加一個(gè)先驗(yàn)概率分布一共795項(xiàng)相乘,所有數(shù)都是0-1之間,結(jié)果一定是一個(gè)很小的接近0的數(shù)。)理論上可以通過(guò)結(jié)果的大小值判斷, 但在#程序運(yùn)行中很可能會(huì)向下溢出無(wú)法比較,因?yàn)橹堤×恕K匀藶榘阎颠M(jìn)行l(wèi)og處理。log在定義域內(nèi)是一個(gè)遞增函數(shù),也就是說(shuō)log(x)中,#x越大,log也就越大,單調(diào)性和原數(shù)據(jù)保持一致。所以加上log對(duì)結(jié)果沒(méi)有影響。此外連乘項(xiàng)通過(guò)log以后,可以變成各項(xiàng)累加,簡(jiǎn)化了計(jì)算。#在似然函數(shù)中通常會(huì)使用log的方式進(jìn)行處理(至于此書中為什么沒(méi)涉及,我也不知道)Py = np.log(Py)#計(jì)算條件概率 Px_y=P(X=x|Y = y)#計(jì)算條件概率分成了兩個(gè)步驟,下方第一個(gè)大for循環(huán)用于累加,參考書中“4.2.3 貝葉斯估計(jì) 式4.10”,下方第一個(gè)大for循環(huán)內(nèi)部是#用于計(jì)算式4.10的分子,至于分子的+1以及分母的計(jì)算在下方第二個(gè)大For內(nèi)#初始化為全0矩陣,用于存放所有情況下的條件概率Px_y = np.zeros((classNum, featureNum, 2))#對(duì)標(biāo)記集進(jìn)行遍歷for i in range(len(trainLabelArr)):#獲取當(dāng)前循環(huán)所使用的標(biāo)記label = trainLabelArr[i]#獲取當(dāng)前要處理的樣本x = trainDataArr[i]#對(duì)該樣本的每一維特診進(jìn)行遍歷for j in range(featureNum):#在矩陣中對(duì)應(yīng)位置加1#這里還沒(méi)有計(jì)算條件概率,先把所有數(shù)累加,全加完以后,在后續(xù)步驟中再求對(duì)應(yīng)的條件概率Px_y[label][j][x[j]] += 1#第二個(gè)大for,計(jì)算式4.10的分母,以及分子和分母之間的除法#循環(huán)每一個(gè)標(biāo)記(共10個(gè))for label in range(classNum):#循環(huán)每一個(gè)標(biāo)記對(duì)應(yīng)的每一個(gè)特征for j in range(featureNum):#獲取y=label,第j個(gè)特診為0的個(gè)數(shù)Px_y0 = Px_y[label][j][0]#獲取y=label,第j個(gè)特診為1的個(gè)數(shù)Px_y1 = Px_y[label][j][1]#對(duì)式4.10的分子和分母進(jìn)行相除,再除之前依據(jù)貝葉斯估計(jì),分母需要加上2(為每個(gè)特征可取值個(gè)數(shù))#分別計(jì)算對(duì)于y= label,x第j個(gè)特征為0和1的條件概率分布Px_y[label][j][0] = np.log((Px_y0 + 1) / (Px_y0 + Px_y1 + 2))Px_y[label][j][1] = np.log((Px_y1 + 1) / (Px_y0 + Px_y1 + 2))#返回先驗(yàn)概率分布和條件概率分布return Py, Px_yif __name__ == "__main__":start = time.time()# 獲取訓(xùn)練集print('start read transSet')trainDataArr, trainLabelArr = loadData('路徑/mnist_train.csv')# print("trainDataArr", trainDataArr, "trainLabelArr", trainLabelArr)# 獲取測(cè)試集print('start read testSet')testDataArr, testLabelArr = loadData('路徑/mnist_test.csv')#開(kāi)始訓(xùn)練,學(xué)習(xí)先驗(yàn)概率分布和條件概率分布print('start to train')Py, Px_y = getAllProbability(trainDataArr, trainLabelArr)#使用習(xí)得的先驗(yàn)概率分布和條件概率分布對(duì)測(cè)試集進(jìn)行測(cè)試print('start to test')accuracy = model_test(Py, Px_y, testDataArr, testLabelArr)#打印準(zhǔn)確率print('the accuracy is:', accuracy)#打印時(shí)間print('time span:', time.time() -start)?
?
樸素貝葉斯對(duì)于貝葉斯,樸素在了哪里?
因?yàn)槌朔ň哂薪粨Q律,所以交換乘法的順序不影響結(jié)果,但是,這就導(dǎo)致了樸素貝葉斯丟失了詞語(yǔ)之間的順序信息。在樸素貝葉斯眼里,“武松打死老虎”和“老虎打死武松”是完全相同的,這也就是說(shuō)明了樸素貝葉斯丟失了詞語(yǔ)之間的順序信息(因?yàn)槌朔ň哂薪粨Q律,所以交換乘法的順序不影響結(jié)果),就相當(dāng)于把所有的詞匯扔進(jìn)了一個(gè)袋子里面隨便攪和。
樸素貝葉斯模型
當(dāng)特征離散的情況:
多項(xiàng)式模型
重復(fù)的詞語(yǔ)我們視為其出現(xiàn)多次,統(tǒng)計(jì)和判斷的時(shí)候都要關(guān)注重復(fù)次數(shù)
伯努利模型
將重復(fù)出現(xiàn)的詞語(yǔ)都視為其只出現(xiàn)一次,這種方式更加簡(jiǎn)化與方便。當(dāng)然也丟失了詞頻信息,因此效果會(huì)差點(diǎn)。
混合模型
在計(jì)算句子概率時(shí),不考慮重復(fù)詞語(yǔ)出現(xiàn)的次數(shù),但是在統(tǒng)計(jì)計(jì)算詞語(yǔ)的概率時(shí),卻考慮重復(fù)詞語(yǔ)出現(xiàn)的次數(shù),也就是在訓(xùn)練的時(shí)候考慮重復(fù)次數(shù),測(cè)試的時(shí)候不考慮。這種方式更加簡(jiǎn)化與方便。當(dāng)然也丟失了詞頻信息,因此效果會(huì)差點(diǎn)。在訓(xùn)練的時(shí)候關(guān)注樣本的真實(shí)概率分布,而測(cè)試的時(shí)候?yàn)榱藢?shí)時(shí)判斷,就只計(jì)算一次。這種更關(guān)注實(shí)時(shí)性,因?yàn)榕袛嘟y(tǒng)計(jì)的時(shí)候會(huì)更快點(diǎn)。
當(dāng)特征連續(xù)的情況:
高斯模型
當(dāng)樣本為例如身高體重等類似的連續(xù)特征,并且樣本數(shù)量太少無(wú)法進(jìn)行區(qū)間計(jì)算時(shí),我們可以根據(jù)樣本計(jì)算出均值和方差,并且假設(shè)樣本分布為正態(tài)分布,這樣我們就得到了密度函數(shù)。根據(jù)密度函數(shù),我們可以將待求得特征值代入,得到密度函數(shù)得值。比如,男性的身高是均值5.855、方差0.035的正態(tài)分布。所以,男性的身高為6英尺的概率的相對(duì)值等于1.5789。根據(jù)得到的值進(jìn)行計(jì)算類別。
?
平滑技術(shù)
常用得平滑技術(shù)基本上時(shí)拉普拉斯平滑。由于在測(cè)試集上,可能出現(xiàn)未記錄得特征,導(dǎo)致P(x|y)為0,從而得到的P(y|x)為0,這顯然時(shí)不對(duì)的。這個(gè)錯(cuò)誤是因?yàn)橛?xùn)練集不足,所以,這個(gè)時(shí)候我們引入平滑技術(shù)。
思想其實(shí)很簡(jiǎn)單,只要讓概率不為0就好了,哪怕是一個(gè)再小的數(shù)都可以。所以,對(duì)于每個(gè)類別下所有劃分的計(jì)數(shù)都加1。
?
其中ajl,代表第j個(gè)特征的第l個(gè)選擇,Sj代表第j個(gè)特征的個(gè)數(shù),K代表種類的個(gè)數(shù)。為1就是拉普拉斯平滑。
?
面試題(我只是個(gè)搬運(yùn)工):
問(wèn)題:什么是貝葉斯決策論?
回答:貝葉斯決策論是概率框架下實(shí)施決策的基本方法。要了解貝葉斯決策論,首先得先了解以下幾個(gè)概念:先驗(yàn)概率、條件概率、后驗(yàn)概率、誤判損失、條件風(fēng)險(xiǎn)、貝葉斯判別準(zhǔn)則。概念似乎有點(diǎn)多,別急,下面我們一個(gè)個(gè)來(lái)進(jìn)行討論。
先驗(yàn)概率: 所謂先驗(yàn)概率,就是根據(jù)以往的經(jīng)驗(yàn)或者現(xiàn)有數(shù)據(jù)的分析所得到的概率。如,隨機(jī)扔一枚硬幣,則p(正面) = p(反面) = 1/2,這是我們根據(jù)已知的知識(shí)所知道的信息,即p(正面) = 1/2為先驗(yàn)概率。
條件概率: 所謂條件概率是指事件A在另一事件B發(fā)生的條件下發(fā)送的概率。用數(shù)學(xué)符號(hào)表示為:P(B|A),即B在A發(fā)生的條件下發(fā)生的概率。舉個(gè)栗子,你早上誤喝了一瓶過(guò)期了的牛奶(A),那我們來(lái)算一下你今天拉肚子的概率(B),這個(gè)就叫做條件概率。即P(拉肚子|喝了過(guò)期牛奶), 易見(jiàn),條件概率是有因求果(知道原因推測(cè)結(jié)果)。
后驗(yàn)概率: 后驗(yàn)概率跟條件概率的表達(dá)形式有點(diǎn)相似。數(shù)學(xué)表達(dá)式為p(A|B), 即A在B發(fā)生的條件下發(fā)生的概率。以誤喝牛奶的例子為例,現(xiàn)在知道了你今天拉肚子了(B),算一下你早上誤喝了一瓶過(guò)期了的牛奶(A)的概率, 即P(A|B),這就是后驗(yàn)概率,后驗(yàn)概率是有果求因(知道結(jié)果推出原因)
誤判損失: 數(shù)學(xué)表達(dá)式:L(j|i), 判別損失表示把一個(gè)標(biāo)記為i類的樣本誤分類為j類所造成的損失。 比如,當(dāng)你去參加體檢時(shí),明明你各項(xiàng)指標(biāo)都是正常的,但是醫(yī)生卻把你分為癌癥病人,這就造成了誤判損失,用數(shù)學(xué)表示為:L(癌癥|正常)。
條件風(fēng)險(xiǎn): 是指基于后驗(yàn)概率P(i|x)可獲得將樣本x分類為i所產(chǎn)生的期望損失,公式為:R(i|x) = ∑L(i|j)P(j|x)。(其實(shí)就是所有判別損失的加權(quán)和,而這個(gè)權(quán)就是樣本判為j類的概率,樣本本來(lái)應(yīng)該含有P(j|x)的概率判為j類,但是卻判為了i類,這就造成了錯(cuò)判損失,而將所有的錯(cuò)判損失與正確判斷的概率的乘積相加,就能得到樣本錯(cuò)判為i類的平均損失,即條件風(fēng)險(xiǎn)。)
舉個(gè)栗子,假設(shè)把癌癥病人判為正常人的誤判損失是100,把正常人判為癌癥病人的誤判損失是10,把感冒病人判為癌癥的誤判損失是8,即L(正常|癌癥) = 100, L(癌癥|正常) = 10,L(癌癥|感冒) = 8, 現(xiàn)在,我們經(jīng)過(guò)計(jì)算知道有一個(gè)來(lái)體檢的員工的后驗(yàn)概率分別為:p(正常|各項(xiàng)指標(biāo)) = 0.2, p(感冒|各項(xiàng)指標(biāo)) = 0.4, p( 癌癥|各項(xiàng)指標(biāo))=0.4。假如我們需要計(jì)算將這個(gè)員工判為癌癥的條件風(fēng)險(xiǎn),則:R(癌癥|各項(xiàng)指標(biāo)) = L(癌癥|正常)* p(正常|各項(xiàng)指標(biāo)) + L(癌癥|感冒) * p(感冒|各項(xiàng)指標(biāo)) = 5.2。
貝葉斯判別準(zhǔn)則: 貝葉斯判別準(zhǔn)則是找到一個(gè)使條件風(fēng)險(xiǎn)達(dá)到最小的判別方法。即,將樣本判為哪一類,所得到的條件風(fēng)險(xiǎn)R(i|x)(或者說(shuō)平均判別損失)最小,那就將樣本歸為那個(gè)造成平均判別損失最小的類。
此時(shí):h*(x) = argminR(i|x) 就稱為 貝葉斯最優(yōu)分類器。
總結(jié):貝葉斯決策論是基于先驗(yàn)概率求解后驗(yàn)概率的方法,其核心是尋找一個(gè)判別準(zhǔn)則使得條件風(fēng)險(xiǎn)達(dá)到最小。而在最小化分類錯(cuò)誤率的目標(biāo)下,貝葉斯最優(yōu)分類器又可以轉(zhuǎn)化為求后驗(yàn)概率達(dá)到最大的類別標(biāo)記,即 h*(x) = argmaxP(i|x)。(此時(shí),L(i|j) = 0, if i = j;L(i|j) = 1, otherwise)
問(wèn)題1:你知道什么叫做樸素貝葉斯嗎?
回答:知道。樸素貝葉斯采用 屬性條件獨(dú)立性 的假設(shè),對(duì)于給定的待分類觀測(cè)數(shù)據(jù)X,計(jì)算在X出現(xiàn)的條件下,各個(gè)目標(biāo)類出現(xiàn)的概率(即后驗(yàn)概率),將該后驗(yàn)概率最大的類作為X所屬的類。而計(jì)算后驗(yàn)概率的貝葉斯公式為:p(A|B) =[ p(A) * p(B|A)]/p(B),因?yàn)閜(B)表示觀測(cè)數(shù)據(jù)X出現(xiàn)的概率,它在所有關(guān)于X的分類計(jì)算公式中都是相同的,所以我們可以把p(B)忽略,則 p(A|B)= p(A) * p(B|A)。
舉個(gè)栗子,公司里面男性有60人,女性有40人,男性穿皮鞋的人數(shù)有25人,穿運(yùn)動(dòng)鞋的人數(shù)有35人,女性穿皮鞋的人數(shù)有10人,穿高跟鞋的人數(shù)有30人。現(xiàn)在你只知道有一個(gè)人穿了皮鞋,這時(shí)候你就需要推測(cè)他的性別是什么。如果推測(cè)出他是男性的概率大于女性,那么就認(rèn)為他是男性,否則認(rèn)為他是女性。(如果此時(shí)條件允許,你可以現(xiàn)場(chǎng)給面試官演示一下怎么計(jì)算, 計(jì)算過(guò)程如下:
p(性別 = 男性) = 0.6
p(性別 = 女性) = 0.4
p(穿皮鞋|男性)? = 0.417
p(穿皮鞋|女性) = 0.25
p(穿皮鞋|男性) * p(性別 = 男性) = 0.2502
p(穿皮鞋|女性) * p(性別 = 女性) = 0.1
因?yàn)?.2502>0.1, 所以我們可以認(rèn)為這個(gè)人是男性)
?
問(wèn)題2:樸素貝葉斯中的“樸素”怎么理解?
回答:樸素貝葉斯中的樸素可以理解為是“簡(jiǎn)單、天真”的意思,因?yàn)椤皹闼亍笔羌僭O(shè)了特征之間是同等重要、相互獨(dú)立、互不影響的,但是在我們的現(xiàn)實(shí)社會(huì)中,屬性之間并不是都是互相獨(dú)立的,有些屬性也會(huì)存在性,所以說(shuō)樸素貝葉斯是一種很“樸素”的算法。
(有沒(méi)有注意到,如果遇到這個(gè)問(wèn)題的話,接下來(lái)面試官可能會(huì)問(wèn)的范圍就很廣了,建議面試者可以準(zhǔn)備一下半樸素貝葉斯跟貝葉斯網(wǎng)絡(luò)的知識(shí))
問(wèn)題3:你能說(shuō)說(shuō)樸素貝葉斯的工作流程是怎么樣的嗎?
回答:樸素貝葉斯的工作流程可以分為三個(gè)階段進(jìn)行,分別是準(zhǔn)備階段、分類器訓(xùn)練階段和應(yīng)用階段。
準(zhǔn)備階段:這個(gè)階段的任務(wù)是為樸素貝葉斯分類做必要的準(zhǔn)備,主要工作是根據(jù)具體情況確定特征屬性,并對(duì)每個(gè)特征屬性進(jìn)行適當(dāng)劃分,去除高度相關(guān)性的屬性(如果兩個(gè)屬性具有高度相關(guān)性的話,那么該屬性將會(huì)在模型中發(fā)揮了2次作用,會(huì)使得樸素貝葉斯所預(yù)測(cè)的結(jié)果向該屬性所希望的方向偏離,導(dǎo)致分類出現(xiàn)偏差),然后由人工對(duì)一部分待分類項(xiàng)進(jìn)行分類,形成訓(xùn)練樣本集合。這一階段的輸入是所有待分類數(shù)據(jù),輸出是特征屬性和訓(xùn)練樣本。(這一階段是整個(gè)樸素貝葉斯分類中唯一需要人工完成的階段,其質(zhì)量對(duì)整個(gè)過(guò)程將有重要影響。)
分類器訓(xùn)練階段:這個(gè)階段的任務(wù)就是生成分類器,主要工作是計(jì)算每個(gè)類別在訓(xùn)練樣本中的出現(xiàn)頻率及每個(gè)特征屬性劃分對(duì)每個(gè)類別的條件概率估計(jì),并將結(jié)果記錄。其輸入是特征屬性和訓(xùn)練樣本,輸出是分類器。這一階段是機(jī)械性階段,根據(jù)前面討論的公式可以由程序自動(dòng)計(jì)算完成。
應(yīng)用階段:這個(gè)階段的任務(wù)是使用分類器對(duì)待分類項(xiàng)進(jìn)行分類,其輸入是分類器和待分類項(xiàng),輸出是待分類項(xiàng)與類別的映射關(guān)系。這一階段也是機(jī)械性階段,由程序完成。
?
問(wèn)題4:你能給我說(shuō)說(shuō)樸素貝葉斯有什么優(yōu)缺點(diǎn)嗎?
回答:樸素貝葉斯的優(yōu)點(diǎn)有4個(gè),分別是:
樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有穩(wěn)定的分類效率。
對(duì)缺失數(shù)據(jù)不太敏感,算法也比較簡(jiǎn)單,常用于文本分類。
分類準(zhǔn)確度高,速度快。
對(duì)小規(guī)模的數(shù)據(jù)表現(xiàn)很好,能處理多分類任務(wù),適合增量式訓(xùn)練,當(dāng)數(shù)據(jù)量超出內(nèi)存時(shí),我們可以一批批的去增量訓(xùn)練(樸素貝葉斯在訓(xùn)練過(guò)程中只需要計(jì)算各個(gè)類的概率和各個(gè)屬性的類條件概率,這些概率值可以快速地根據(jù)增量數(shù)據(jù)進(jìn)行更新,無(wú)需重新全量計(jì)算)。
樸素貝葉斯的缺點(diǎn)有3個(gè),分別是:
對(duì)訓(xùn)練數(shù)據(jù)的依賴性很強(qiáng),如果訓(xùn)練數(shù)據(jù)誤差較大,那么預(yù)測(cè)出來(lái)的效果就會(huì)不佳。
理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。 但是在實(shí)際中,因?yàn)闃闼刎惾~斯“樸素,”的特點(diǎn),導(dǎo)致在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí),分類效果不好。 而在屬性相關(guān)性較小時(shí),樸素貝葉斯性能最為良好。 對(duì)于這一點(diǎn),有半樸素貝葉斯之類的算法通過(guò)考慮部分關(guān)聯(lián)性適度改進(jìn)。
需要知道先驗(yàn)概率,且先驗(yàn)概率很多時(shí)候是基于假設(shè)或者已有的訓(xùn)練數(shù)據(jù)所得的,這在某些時(shí)候可能會(huì)因?yàn)榧僭O(shè)先驗(yàn)概率的原因出現(xiàn)分類決策上的錯(cuò)誤。
問(wèn)題5:“樸素”是樸素貝葉斯在進(jìn)行預(yù)測(cè)時(shí)候的缺點(diǎn),那么有這么一個(gè)明顯的假設(shè)缺點(diǎn)在,為什么樸素貝葉斯的預(yù)測(cè)仍然可以取得較好的效果?
回答:
對(duì)于分類任務(wù)來(lái)說(shuō),只要各個(gè)條件概率之間的排序正確,那么就可以通過(guò)比較概率大小來(lái)進(jìn)行分類,不需要知道精確的概率值(樸素貝葉斯分類的核心思想是找出后驗(yàn)概率最大的那個(gè)類,而不是求出其精確的概率)
如果屬性之間的相互依賴對(duì)所有類別的影響相同,或者相互依賴關(guān)系可以互相抵消,那么屬性條件獨(dú)立性的假設(shè)在降低計(jì)算開(kāi)銷的同時(shí)不會(huì)對(duì)分類結(jié)果產(chǎn)生不良影響。
問(wèn)題6:什么是拉普拉斯平滑法?
回答:拉普拉斯平滑法是樸素貝葉斯中處理零概率問(wèn)題的一種修正方式。在進(jìn)行分類的時(shí)候,可能會(huì)出現(xiàn)某個(gè)屬性在訓(xùn)練集中沒(méi)有與某個(gè)類同時(shí)出現(xiàn)過(guò)的情況,如果直接基于樸素貝葉斯分類器的表達(dá)式進(jìn)行計(jì)算的話就會(huì)出現(xiàn)零概率現(xiàn)象。為了避免其他屬性所攜帶的信息被訓(xùn)練集中未出現(xiàn)過(guò)的屬性值“抹去”,所以才使用拉普拉斯估計(jì)器進(jìn)行修正。具體的方法是:在分子上加1,對(duì)于先驗(yàn)概率,在分母上加上訓(xùn)練集中可能的類別數(shù);對(duì)于條件概率,則在分母上加上第i個(gè)屬性可能的取值數(shù)
問(wèn)題7:樸素貝葉斯中有沒(méi)有超參數(shù)可以調(diào)?
回答:樸素貝葉斯是沒(méi)有超參數(shù)可以調(diào)的,所以它不需要調(diào)參,樸素貝葉斯是根據(jù)訓(xùn)練集進(jìn)行分類,分類出來(lái)的結(jié)果基本上就是確定了的,拉普拉斯估計(jì)器不是樸素貝葉斯中的參數(shù),不能通過(guò)拉普拉斯估計(jì)器來(lái)對(duì)樸素貝葉斯調(diào)參。
問(wèn)題8:樸素貝葉斯中有多少種模型?
回答:樸素貝葉斯含有3種模型,分別是高斯模型,對(duì)連續(xù)型數(shù)據(jù)進(jìn)行處理;多項(xiàng)式模型,對(duì)離散型數(shù)據(jù)進(jìn)行處理,計(jì)算數(shù)據(jù)的條件概率(使用拉普拉斯估計(jì)器進(jìn)行平滑的一個(gè)模型);伯努利模型,伯努利模型的取值特征是布爾型,即出現(xiàn)為ture,不出現(xiàn)為false,在進(jìn)行文檔分類時(shí),就是一個(gè)單詞有沒(méi)有在一個(gè)文檔中出現(xiàn)過(guò)。
問(wèn)題9: 你知道樸素貝葉斯有哪些應(yīng)用嗎?
回答:知道(肯定得知道啊,不然不就白學(xué)了嗎?) 樸素貝葉斯的應(yīng)用最廣的應(yīng)該就是在文檔分類、垃圾文本過(guò)濾(如垃圾郵件、垃圾信息等)、情感分析(微博、論壇上的積極、消極等情緒判別)這些方面,除此之外還有多分類實(shí)時(shí)預(yù)測(cè)、推薦系統(tǒng)(貝葉斯與協(xié)同過(guò)濾組合使用)、拼寫矯正(當(dāng)你輸入一個(gè)錯(cuò)誤單詞時(shí),可以通過(guò)文檔庫(kù)中出現(xiàn)的概率對(duì)你的輸入進(jìn)行矯正)等。
問(wèn)題10:你覺(jué)得樸素貝葉斯對(duì)異常值敏不敏感?
回答:樸素貝葉斯對(duì)異常值不敏感。所以在進(jìn)行數(shù)據(jù)處理時(shí),我們可以不去除異常值,因?yàn)楸A舢惓V悼梢员3謽闼刎惾~斯算法的整體精度,而去除異常值則可能在進(jìn)行預(yù)測(cè)的過(guò)程中由于失去部分異常值導(dǎo)致模型的泛化能力下降。
問(wèn)題11:樸素貝葉斯是高方差還是低方差模型?
回答:樸素貝葉斯是低方差模型。(誤差 = 偏差 + 方差)對(duì)于復(fù)雜模型來(lái)說(shuō),由于復(fù)雜模型充分?jǐn)M合了部分?jǐn)?shù)據(jù),使得它們的偏差變小,但由于對(duì)部分?jǐn)?shù)據(jù)過(guò)分?jǐn)M合,這就導(dǎo)致預(yù)測(cè)的方差會(huì)變大。因?yàn)闃闼刎惾~斯假設(shè)了各個(gè)屬性之間是相互的,算是一個(gè)簡(jiǎn)單的模型。對(duì)于簡(jiǎn)單的模型來(lái)說(shuō),則恰恰相反,簡(jiǎn)單模型的偏差會(huì)更大,相對(duì)的,方差就會(huì)較小。(偏差是模型輸出值與真實(shí)值的誤差,也就是模型的精準(zhǔn)度,方差是預(yù)測(cè)值與模型輸出期望的的誤差,即模型的穩(wěn)定性,也就是數(shù)據(jù)的集中性的一個(gè)指標(biāo))
?
?
?
參考
https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/CodePic.png? ? ? ? ? ? ? ? ? ? ?(實(shí)現(xiàn)李航統(tǒng)計(jì)學(xué)習(xí)里面的代碼,基本上每行都有注釋,很nice)
https://cloud.tencent.com/developer/article/1474960? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(樸素貝葉斯面試題來(lái)源)
?
總結(jié)
以上是生活随笔為你收集整理的朴素贝叶斯模型简单理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信分享出错问题,MicroMsg.SD
- 下一篇: 阿森纳球迷高考试卷