
機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之樸素貝葉斯
一、概述
樸素貝葉斯分類(lèi)算法是基于概率論中的貝葉斯公式得到的,也是比較常用的一種算法,而樸素代表的是屬性之間的獨(dú)立性,這樣聯(lián)合概率可以轉(zhuǎn)換成各概率分量的乘積。
二、算法思想
其實(shí)這個(gè)算法的思想就是貝葉斯公式,如果不是很了解也沒(méi)什么關(guān)系,只要看點(diǎn)例子就明白了,但由于這里只想給大家提供一些實(shí)用代碼,因此就不仔細(xì)說(shuō)例子了,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》中的那個(gè)灰石頭的例子就不錯(cuò),另外,如果還感覺(jué)不是很清楚,推薦看一下《數(shù)據(jù)挖掘導(dǎo)論》中貝葉斯分類(lèi)器部分。
三、實(shí)例算法
不說(shuō)廢話了,現(xiàn)在開(kāi)始介紹樸素貝葉斯的matlab代碼編寫(xiě),這里我們的目標(biāo)是利用樸素貝葉斯進(jìn)行文檔分類(lèi),即確定該文檔是侮辱類(lèi)還是非侮辱類(lèi),分別以1和0表示。
1. 創(chuàng)建測(cè)試數(shù)據(jù)
%% 建立測(cè)試數(shù)據(jù)
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];
意義應(yīng)該還是比較明確的,就是說(shuō)2,4,6是帶有侮辱性語(yǔ)句的文檔
2. 創(chuàng)建無(wú)重復(fù)單詞的列表
%% 創(chuàng)建無(wú)重復(fù)單詞的列表
[m, n] = size(postingList);
VocabList = [];
for i = 1: m
tempstr = postingList{i};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
VocabList = [VocabList, str_split];
end
VocabList_unique = unique(VocabList);
可以看一下單詞列表
>> VocabList_unique
VocabList_unique =
Columns 1 through 8
‘I’ ‘a(chǎn)te’ ‘buying’ ‘cute’ ‘dalmation’ ‘dog’ ‘flea’ ‘food’
Columns 9 through 16
‘garbage’ ‘has’ ‘help’ ‘him’ ‘how’ ‘is’ ‘licks’ ‘love’
Columns 17 through 24
‘maybe’ ‘mr’ ‘my’ ‘not’ ‘park’ ‘please’ ‘posting’ ‘problems’
Columns 25 through 32
‘quit’ ‘so’ ‘steak’ ‘stop’ ‘stupid’ ‘take’ ‘to’ ‘worthless’
3. 創(chuàng)建列表向量
由于單詞不好進(jìn)行表述,我們需要根據(jù)單詞列表創(chuàng)建一個(gè)向量表示列表中的單詞是否出現(xiàn),出現(xiàn)用1表示,未出現(xiàn)用0表示。
setOfWords2Vec.m文件如下
function wordsVec = setOfWords2Vec(vocabList, inputSet)
vocabList = unique(vocabList);
inputSet = unique(inputSet);
Listnum = length(vocabList);
inputnum = length(inputSet);
wordsVec = zeros(1, Listnum);
for i = 1: inputnum
for j = 1: Listnum
if (strcmp(vocabList{j}, inputSet{i}))
wordsVec(j) = 1;
end
end
end
列表向量測(cè)試代碼如下
%% 創(chuàng)建列表向量測(cè)試
tempstr = postingList{1};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
wordsVec = setOfWords2Vec(VocabList_unique, str_split);
測(cè)試結(jié)果如下
wordsVec =
Columns 1 through 14
0 0 0 0 0 1 1 0 0 1 1 0 0 0
Columns 15 through 28
0 0 0 0 1 0 0 1 0 1 0 0 0 0
Columns 29 through 32
0 0 0 0
上面的意思是測(cè)試postingList第一句’my dog has flea problems help please’
在單詞表中的描述,對(duì)照上面的單詞列表可以看到結(jié)果是正確的,比如wordsVec中的第六第七項(xiàng)為1,在單詞表中表示的是dog 和 flea,這連個(gè)此時(shí)在上面那句話中出現(xiàn)的。
4. 貝葉斯分類(lèi)函數(shù)編寫(xiě)
trainNB0.m文件
function [p0Vect, p1Vect, pAbusive] = trainNB0(trainMatrix, trainCategory)
[m, n] = size(trainMatrix);
pAbusive = sum(trainCategory) / m;
p1words = trainMatrix(find(trainCategory), :);
p0words = trainMatrix(find(1 – trainCategory), :);
p0wordscount = sum(p0words, 1) + 1; % 加1是為了防止出現(xiàn)0概率
p1wordscount = sum(p1words, 1) + 1;
p0Vect = log(p0wordscount ./ sum(p0wordscount));
p1Vect = log(p1wordscount ./ sum(p1wordscount));
這段代碼還是要說(shuō)明一下的
(1)注釋位置那句對(duì)每個(gè)單詞的出現(xiàn)初始化為1,就是說(shuō)就算單詞沒(méi)出現(xiàn),也將其計(jì)算為1,這是防止出現(xiàn)0概率,導(dǎo)致乘積為0。當(dāng)然避免這個(gè)的方法有很多,每本書(shū)都不太一樣,這里的+1采用的是Laplace平滑方法。
(2)最后算概率加了個(gè)log是減少其動(dòng)態(tài)范圍。
這兩個(gè)都是為了實(shí)際應(yīng)用對(duì)代碼進(jìn)行的修改,也就是說(shuō),就基本原理而言,不需要+1和增加log。
下面,我們對(duì)這個(gè)代碼進(jìn)行測(cè)試
%% 測(cè)試trainNB0
trainMatrix = [];
for i = 1: m
tempstr = postingList{i};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
wordsVec = setOfWords2Vec(VocabList_unique, str_split);
trainMatrix = [trainMatrix;wordsVec];
end
[p0V, p1V, pAb] = trainNB0(trainMatrix, classVec);
p0V代表0分類(lèi)下,每個(gè)單詞的出現(xiàn)概率,也就是先驗(yàn)概率(由于用了log,所以是負(fù)數(shù),并且由于+1,故沒(méi)有無(wú)窮大項(xiàng)目)
p0V =
Columns 1 through 8
-3.3322 -3.3322 -4.0254 -3.3322 -3.3322 -3.3322 -3.3322 -4.0254
Columns 9 through 16
-4.0254 -3.3322 -3.3322 -2.9267 -3.3322 -3.3322 -3.3322 -3.3322
Columns 17 through 24
-4.0254 -3.3322 -2.6391 -4.0254 -4.0254 -3.3322 -4.0254 -3.3322
Columns 25 through 32
-4.0254 -3.3322 -3.3322 -3.3322 -4.0254 -4.0254 -3.3322 -4.0254
p1V意義類(lèi)似
p1V =
Columns 1 through 8
-3.9318 -3.9318 -3.2387 -3.9318 -3.9318 -2.8332 -3.9318 -3.2387
Columns 9 through 16
-3.2387 -3.9318 -3.9318 -3.2387 -3.9318 -3.9318 -3.9318 -3.9318
Columns 17 through 24
-3.2387 -3.9318 -3.9318 -3.2387 -3.2387 -3.9318 -3.2387 -3.9318
Columns 25 through 32
-3.2387 -3.9318 -3.9318 -3.2387 -2.5455 -3.2387 -3.2387 -2.8332
pAb代表的是分類(lèi)為1的文件占所有文件的比例
pAb = 0.5
這個(gè)很明顯,因?yàn)闇y(cè)試數(shù)據(jù)中有三個(gè)分類(lèi)為1,并且一個(gè)有6項(xiàng)。
5. 分類(lèi)測(cè)試
訓(xùn)練部分的代碼已經(jīng)寫(xiě)完了,下面我們的分類(lèi)器就可以使用了,利用貝葉斯公式計(jì)算p(c | w)并比較大小可以確定分類(lèi)c。
對(duì)于本例來(lái)說(shuō)
p(w|0) = 待分類(lèi)語(yǔ)句中每個(gè)單詞在0類(lèi)出現(xiàn)的概率的乘積
p(w|1) = 待分類(lèi)語(yǔ)句中每個(gè)單詞在1類(lèi)出現(xiàn)的概率的乘積
p(0|w) = p(w|0)*p(0) / p(w)
p(1|w) = p(w|1)*p(1) / p(w)
如果p(0|w) > p(1|w)分類(lèi)就是0,反之就是1
代碼如下
classifyNB.m
function classRes = classifyNB(vec2Classify, p0Vec, p1Vec, pClass1)
p1 = sum(vec2Classify .* p1Vec) + log(pClass1);
p0 = sum(vec2Classify .* p0Vec) + log(1 – pClass1);
if p1 > p0
classRes = 1;
else
classRes = 0;
end
說(shuō)明:
由于前面的概率是以log形式表示的,所以乘積就變成了加法,還有就是p(w)不影響比較結(jié)果,因此未予計(jì)算。
測(cè)試代碼如下
%% 進(jìn)行分類(lèi)測(cè)試
testEntry = ‘love my dalmation’;
str_split = regexp(testEntry, ‘W*s+’, ‘split’);
wordsVec1 = setOfWords2Vec(VocabList_unique, str_split);
classRes1 = classifyNB(wordsVec1, p0V, p1V, pAb);
testEntry = ‘stupid garbage’;
str_split = regexp(testEntry, ‘W*s+’, ‘split’);
wordsVec2 = setOfWords2Vec(VocabList_unique, str_split);
classRes2 = classifyNB(wordsVec2, p0V, p1V, pAb);
結(jié)果就是
classRes1 = 0
classRes2 = 1
也就是說(shuō),分類(lèi)確定第二句帶有侮辱性,其實(shí)從其中的stupid就可以看出
四、算法應(yīng)用
前面就說(shuō)過(guò),這個(gè)算法應(yīng)用很廣,《實(shí)戰(zhàn)》中給出了兩個(gè)實(shí)例,一個(gè)是垃圾郵件分類(lèi),這個(gè)和我們這里做的文本分類(lèi)非常類(lèi)似,另外一個(gè)就是從個(gè)人廣告中獲取區(qū)域傾向。都是平時(shí)我們經(jīng)常使用的功能,如果有興趣可以自己編著試一下,很多還是挺有意思的。
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢(xún)效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類(lèi)型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專(zhuān)業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專(zhuān)業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶(hù)體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷(xiāo)案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷(xiāo)成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類(lèi)分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類(lèi)分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10