天天看點

機器學習:樸素貝葉斯分類器(附代碼實作)

首先給出貝葉斯公式:

機器學習:樸素貝葉斯分類器(附代碼實作)

其中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)

相關博文:半樸素貝葉斯分類器

繼續閱讀