首先給出貝葉斯公式:
其中x表示樣本,c表示類别。
一些概念:
P(c)為先驗機率,即在得到新資料前的假設機率;
P(c|x)為後驗機率,即在看到新資料後,我們要計算的該假設機率;
P(x|c)為該假設下得到這一資料的機率,稱為似然度;
P(x)是在任意假設下得到這一資料的機率,稱為标準化常量。
公式左邊是這樣一個條件機率:已知樣本x,求它屬于c類的機率。那麼,相應的算法就變成,對于給定的待分類樣本x,分别計算它屬于不同分類的機率,機率最大者對應的類别就是x的類别。那麼,問題就轉變為求解公式右邊的3個機率,下面就來看這3個機率怎麼求。
P(x)與類别标記無關,是一個常量,不影響最後大小的比較,計算中可以忽略;
P(c)表達了樣本空間中各類所占的比例,可以用如下公式計算:
P(x|c)是所有屬性上的聯合機率,不好直接估計。這裡要用到樸素貝葉斯分類器的一個重要假設:屬性條件獨立性假設,即假設所有屬性互相獨立。
基于屬性條件獨立性假設,貝葉斯公式可寫成:
其中d為屬性數目,Xi為第i個屬性上的取值。忽略P(x),進一步得到貝葉斯判定準則:
問題轉變為求條件機率P(Xi|c)。對于離散屬性,通過下面公式計算:
對于連續屬性,公式如下:
至此,根據貝葉斯判定準則,可以得到x的分類。
為了防止訓練集中有屬性未出現,常用“拉普拉斯修正”(平滑處理),把P(c)和P(Xi|c)改寫成如下形式:
matlab代碼:
%每個屬性可能取值數,0表示連續屬性
%validattrs_num = [3,3,3,3,3,2,0,0];
%mean_variance:計算的均值和方差,結構:struct('mean',{[1,2],[2,3]},'variance',{[3,4],[4,5]});
function [class] = predictFunc(x,y,validattrs_num,mean_variance,example1)
t = tabulate(y+1);
%類别标記
classes = t(:,1)-1;
%類别數
classes_num = t(:,2);
%類别頻率,拉普拉斯修正
classes_fr = (classes_num+1)./(length(y)+length(classes));
%類别預測機率
pr = 1;
max_pr = 0;
%預測的類别
class = 0;
%同類别同屬性計數器
sameattr_num = 0;
%類别循環
for i=1:length(classes),
%連續屬性的均值方差的索引
index= 1;
%屬性循環
for j=1:length(example1),
%離散屬性
if validattrs_num(j)~=0,
%樣本循環
for k=1:length(y),
%處理某一類别
if classes(i) == y(k),
%離散屬性值相同,計數
if isequal(x{k,j},example1{1,j}),
sameattr_num = sameattr_num + 1;
endif;
endif;
endfor;
%拉普拉斯修正的比例
pr = pr * ((sameattr_num+1)/(classes_num(i)+validattrs_num(j)));
sameattr_num = 0;
else%連續屬性機率密度
pr = pr * exp(-(example1{1,j}-mean_variance.mean{index}(i))^2/(2*mean_variance.variance{index}(i)))/((2*pi*mean_variance.variance{index}(i))^0.5);
index = index + 1;
endif;
endfor;
pr = pr * classes_fr(i);
%最大機率對應的類别
if pr>max_pr,
max_pr = pr;
class = classes(i);
endif;
pr = 1;
endfor;
微信交流
多謝打賞
參考資料:周志華《機器學習》,Allen《貝葉斯思維》
參考博文:樸素貝葉斯分類器(Naive Bayesian Classifier)
相關博文:半樸素貝葉斯分類器