




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上數(shù)據(jù)挖掘(8):樸素貝葉斯分類算法原理與實踐隔了很久沒有寫數(shù)據(jù)挖掘系列的文章了,今天介紹一下樸素貝葉斯分類算法,講一下基本原理,再以文本分類實踐。 一個簡單的例子樸素貝葉斯算法是一個典型的統(tǒng)計學習方法,主要理論基礎就是一個貝葉斯公式,貝葉斯公式的基本定義如下:這個公式雖然看上去簡單,但它卻能總結歷史,預知未來。公式的右邊是總結歷史,公式的左邊是預知未來,如果把Y看出類別,X看出特征,P(Yk|X)就是在已知特征X的情況下求Yk類別的概率,而對P(Yk|X)的計算又全部轉化到類別Yk的特征分布上來。舉個例子,大學的時候,某男生經(jīng)常去圖書室晚自習,發(fā)現(xiàn)他喜歡的那
2、個女生也常去那個自習室,心中竊喜,于是每天買點好吃點在那個自習室蹲點等她來,可是人家女生不一定每天都來,眼看天氣漸漸炎熱,圖書館又不開空調(diào),如果那個女生沒有去自修室,該男生也就不去,每次男生鼓足勇氣說:“嘿,你明天還來不?”,“啊,不知道,看情況”。然后該男生每天就把她去自習室與否以及一些其他情況做一下記錄,用Y表示該女生是否去自習室,即Y=去,不去,X是跟去自修室有關聯(lián)的一系列條件,比如當天上了哪門主課,蹲點統(tǒng)計了一段時間后,該男生打算今天不再蹲點,而是先預測一下她會不會去,現(xiàn)在已經(jīng)知道了今天上了常微分方法這么主課,于是計算P(Y=去|常微分方程)與P(Y=不去|常微分方程),看哪個概率大,
3、如果P(Y=去|常微分方程) >P(Y=不去|常微分方程),那這個男生不管多熱都屁顛屁顛去自習室了,否則不就去自習室受罪了。P(Y=去|常微分方程)的計算可以轉為計算以前她去的情況下,那天主課是常微分的概率P(常微分方程|Y=去),注意公式右邊的分母對每個類別(去/不去)都是一樣的,所以計算的時候忽略掉分母,這樣雖然得到的概率值已經(jīng)不再是01之間,但是其大小還是能選擇類別。后來他發(fā)現(xiàn)還有一些其他條件可以挖,比如當天星期幾、當天的天氣,以及上一次與她在自修室的氣氛,統(tǒng)計了一段時間后,該男子一計算,發(fā)現(xiàn)不好算了,因為總結歷史的公式:這里n=3,x(1)表示主課,x(2)表示天氣,x(3)表示
4、星期幾,x(4)表示氣氛,Y仍然是去,不去,現(xiàn)在主課有8門,天氣有晴、雨、陰三種、氣氛有A+,A,B+,B,C五種,那么總共需要估計的參數(shù)有8*3*7*5*2=1680個,每天只能收集到一條數(shù)據(jù),那么等湊齊1680條數(shù)據(jù)大學都畢業(yè)了,男生打呼不妙,于是做了一個獨立性假設,假設這些影響她去自習室的原因是獨立互不相關的,于是有了這個獨立假設后,需要估計的參數(shù)就變?yōu)椋?8+3+7+5)*2 = 46個了,而且每天收集的一條數(shù)據(jù),可以提供4個參數(shù),這樣該男生就預測越來越準了。 樸素貝葉斯分類器講了上面的小故事,我們來樸素貝葉斯分類器的表示形式:當特征為為x時,計算所有類別的條件概率,選取條件
5、概率最大的類別作為待分類的類別。由于上公式的分母對每個類別都是一樣的,因此計算時可以不考慮分母,即樸素貝葉斯的樸素體現(xiàn)在其對各個條件的獨立性假設上,加上獨立假設后,大大減少了參數(shù)假設空間。在文本分類上的應用文本分類的應用很多,比如垃圾郵件和垃圾短信的過濾就是一個2分類問題,新聞分類、文本情感分析等都可以看成是文本分類問題,分類問題由兩步組成:訓練和預測,要建立一個分類模型,至少需要有一個訓練數(shù)據(jù)集。貝葉斯模型可以很自然地應用到文本分類上:現(xiàn)在有一篇文檔d(Document),判斷它屬于哪個類別ck,只需要計算文檔d屬于哪一個類別的概率最大:在分類問題中,我們并不是把所有的特征都用上,對一篇文檔
6、d,我們只用其中的部分特征詞項<t1,t2,tnd>(nd表示d中的總詞條數(shù)目),因為很多詞項對分類是沒有價值的,比如一些停用詞“的,是,在”在每個類別中都會出現(xiàn),這個詞項還會模糊分類的決策面,關于特征詞的選取,我的這篇文章有介紹。用特征詞項表示文檔后,計算文檔d的類別轉化為:注意P(Ck|d)只是正比于后面那部分公式,完整的計算還有一個分母,但我們前面討論了,對每個類別而已分母都是一樣的,于是在我們只需要計算分子就能夠進行分類了。實際的計算過程中,多個概率值P(tj|ck)的連乘很容易下溢出為0,因此轉化為對數(shù)計算,連乘就變成了累加:我們只需要從訓練數(shù)據(jù)集中,計算每一個類別的出現(xiàn)
7、概率P(ck)和每一個類別中各個特征詞項的概率P(tj|ck),而這些概率值的計算都采用最大似然估計,說到底就是統(tǒng)計每個詞在各個類別中出現(xiàn)的次數(shù)和各個類別的文檔的數(shù)目:其中,Nck表示訓練集中ck類文檔的數(shù)目,N訓練集中文檔總數(shù);Tjk表示詞項tj在類別ck中出現(xiàn)的次數(shù),V是所有類別的詞項集合。這里對詞的位置作了獨立性假設,即兩個詞只要它們出現(xiàn)的次數(shù)一樣,那不管它們在文檔的出現(xiàn)位置,它們大概率值P(tj|ck)都是一樣,這個位置獨立性假設與現(xiàn)實很不相符,比如“放馬屁”跟“馬放屁”表述的是不同的內(nèi)容,但實踐發(fā)現(xiàn),位置獨立性假設得到的模型準確率并不低,因為大多數(shù)文本分類都是靠詞的差異來區(qū)分,而不是
8、詞的位置,如果考慮詞的位置,那么問題將表達相當復雜,以至于我們無從下手。然后需要注意的一個問題是ti可能沒有出現(xiàn)在ck類別的訓練集,卻出現(xiàn)在ck類別的測試集合中,這樣因為Tik為0,導致連乘概率值都為0,其他特征詞出現(xiàn)得再多,該文檔也不會被分到ck類別,而且在對數(shù)累加的情況下,0值導致計算錯誤,處理這種問題的方法是采樣加1平滑,即認為每個詞在各個類別中都至少出現(xiàn)過一次,即下面這個例子來自于參考文獻1,假設有如下的訓練集合測試集:現(xiàn)在要計算docID為5的測試文檔是否屬于China類別,首先計算個各類的概率,P(c=China)=3/4,P(c!=China)=1/4,然后計算各個類中詞項的概率
9、:注意分母(8+6)中8表示China類的詞項出現(xiàn)的總次數(shù)是8,+6表示平滑,6是總詞項的個數(shù),然后計算測試文檔屬于各個類別的概率:可以看出該測試文檔應該屬于CHina類別。 文本分類實踐我找了搜狗的搜狐新聞數(shù)據(jù)的歷史簡潔版,總共包括汽車、財經(jīng)、it、健康等9類新聞,一共16289條新聞,搜狗給的數(shù)據(jù)是每一篇新聞用一個txt文件保存,我預處理了一下,把所有的新聞文檔保存在一個文本文件中,每一行是一篇新聞,同時保留新聞的id,id的首字母表示類標,預處理并分詞后的示例如下:我用6289條新聞作為訓練集,剩余1萬條用于測試,采用互信息進行文本特征的提取,總共提取的特征詞是700個左右。分
10、類的結果如下:18343 10000 0.8343總共10000條新聞,分類正確的8343條,正確率0.8343,這里主要是演示貝葉斯的分類過程,只考慮了正確率也沒有考慮其他評價指標,也沒有進行優(yōu)化。貝葉斯分類的效率高,訓練時,只需要掃描一遍訓練集,記錄每個詞出現(xiàn)的次數(shù),以及各類文檔出現(xiàn)的次數(shù),測試時也只需要掃描一次測試集,從運行效率這個角度而言,樸素貝葉斯的效率是最高的,而準確率也能達到一個理想的效果。我的實現(xiàn)代碼如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
11、495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128#!encoding=utf-8import randomimport sysimport mathimport collectionsimport sysdef shuffle(): &
12、#160;'''將原來的文本打亂順序,用于得到訓練集和測試集''' datas = line.strip() for line in sys.stdin random.shuffle(datas) for line in datas: print line
13、160; lables = 'A','B','C','D','E','F','G','H','I'def lable2id(lable): for i in xrange(len(lables):
14、; if lable = lablesi: return i raise Exception('Error lable %s' % (lable) def docdict(): return 0*len(lables)
15、160; def mutalInfo(N,Nij,Ni_,N_j): #print N,Nij,Ni_,N_j return Nij * 1.0 / N * math.log(N * (Nij+1)*1.0/(Ni_*N_j)/ math.log(2) def countForMI(): '''基于統(tǒng)計每個詞在每個類別出現(xiàn)的次數(shù),以及每類的文檔
16、數(shù)''' docCount = 0 * len(lables)#每個類的詞數(shù)目 wordCount = collections.defaultdict(docdict) for line in sys.stdin: lable,text = line.strip().split(' ',1
17、) index = lable2id(lable0) words = text.split(' ') for word in words:
18、60; wordCountwordindex += 1 docCountindex += 1 miDict = collections.defaultdict(docdict)#互信息值 N = sum(docCount) &
19、#160; for k,vs in wordCount.items(): for i in xrange(len(vs): N11 = vsi N10 = sum(vs) - N11
20、60; N01 = docCounti - N11 N00 = N - N11 - N10 - N01 mi = mutalInfo(N,N11,N10+N11,N01+N11) + mutalInfo(N,N
21、10,N10+N11,N00+N10)+ mutalInfo(N,N01,N01+N11,N01+N00)+ mutalInfo(N,N00,N00+N10,N00+N01) miDictki = mi fWords = set() for i in xrange(len(docCount):
22、 keyf = lambda x:x1i sortedDict = sorted(miDict.items(),key=keyf,reverse=True) for j in xrange(100): fWords.add(sortedDictj0
23、) print docCount#打印各個類的文檔數(shù)目 for fword in fWords: print fword def loadFeatureWord():
24、; '''導入特征詞''' f = open('feature.txt') docCounts = eval(f.readline() features = set() for line in f: features.add(line.strip(
25、) f.close() return docCounts,features def trainBayes(): '''訓練貝葉斯模型,實際上計算每個類中特征詞的出現(xiàn)次數(shù)''' docCounts,features
26、= loadFeatureWord() wordCount = collections.defaultdict(docdict) tCount = 0*len(docCounts)#每類文檔特征詞出現(xiàn)的次數(shù) for line in sys.stdin: lable,text = line.strip().split('
27、',1) index = lable2id(lable0) words = text.split(' ') for word in words:
28、160; if word in features: tCountindex += 1 wordCountwordindex += 1
29、60; for k,v in wordCount.items(): scores = (vi+1) * 1.0 / (tCounti+len(wordCount) for i in xrange(len(v)#加1平滑 print '%st%s' % (k,scores)
30、60;def loadModel(): '''導入貝葉斯模型''' f = open('model.txt') scores = for line in f: word,counts = line.strip().rsplit('t',1)
31、 scoresword = eval(counts) f.close() return scores def predict(): '''預測文檔的類標,標準輸入每一行為一個文檔'''
32、160;docCounts,features = loadFeatureWord() docscores = math.log(count * 1.0 /sum(docCounts) for count in docCounts scores = loadModel() rCount = 0 docCount = 0 for li
33、ne in sys.stdin: lable,text = line.strip().split(' ',1) index = lable2id(lable0) words = text.split('
34、39;) preValues = list(docscores) for word in words: if word in features:
35、60; for i in xrange(len(preValues): preValuesi+=math.log(scoreswordi) m = max(preValues) pIndex = preValues.index(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲企業(yè)品牌戰(zhàn)略保密與實施指導合同范本
- 長租公寓租賃合同模板品質(zhì)生活新選擇
- 村組織員考試題庫及答案
- 美術消防員課件下載
- 美術創(chuàng)意兒童課件全套
- 3月份安全事故案例
- 安全事故應急預案培訓心得
- 林業(yè)安全生產(chǎn)工作制度
- 橋梁安全保護區(qū)管理制度
- 月安全生產(chǎn)檢查方案
- 2025年中考作文試題預測及范文
- 中間人介紹工作合同模板
- 第3章-機床夾具
- 侵入性操作相關感染防控
- 江蘇省鎮(zhèn)江市近五年中考作文題目及2024年中考作文指導及例文
- 2024年譯林英語三年級上冊Unit1 第1課時 (教學課件)Cartoon time
- 2019級藥劑專業(yè)人才培養(yǎng)方案(中職)
- L07G324鋼筋混凝土密肋樓板
- 2024年軟件測試合同
- 保山市2022~2023學年春季學期期末質(zhì)量監(jiān)測五年級道德與法治-答案
- 承德市承德縣六年級下冊數(shù)學期末測試卷匯編
評論
0/150
提交評論