樸素貝葉斯(Naive-Bayes)

  • 基本原理

貝葉斯定理:image.png 全機率公式:p(x) = p(x/y1)p(y1)+p(x/y2)p(y2)+...p(x/yk)p(yk),其中(y1,y2,...yk)組成一個完備事件且之間相互獨立。算法

  • 前提條件

各個特徵之間相互獨立,其中各個特徵又分別爲離散的類別。 image.png測試

  • 直接上步驟:
  1. 計算訓練X各個特徵xi中某個類別xij在每一類yk下的條件機率:p(xij/yk),全部計算結果存爲三維矩陣Pxy(j,i,k)
  2. 計算各種yk的先驗機率 :p(yk),即該類在整體樣品中所佔的比例
  3. 再根據步驟1和2的計算結果,計算新x的全機率:p(x) = p(x/y1)*p(y1)+p(x/y2)*p(y2)+...p(x/yk)*p(yk),其中,p(x/yk) = Pxy(~,1,k)Pxy(~,2,k)...*Pxy(~,m,k),是yk下樣品出現的機率,~表明該特徵下的該類特徵,m爲特徵維度。
  4. 依據貝葉斯公式計算出P(yk/x),排序選擇最大的類別。
  • matlab測試代碼:
%樸素貝葉斯 --- 分類算法
%假設x特徵之間相互獨立

%輸入: x[n*m]=[特徵1,特徵2,...特徵m],其中特徵一、2...m的值又分別爲ij類(即離散數值)
%       y[n*1]=[類1;類2;...類k]
%如:x=[1,'高'      y=[‘是’
%       0,'低'         ‘否’
%       1,'中'         ‘是’
%       0,'高']        ‘否’]

%輸出:p(xi)
clc;clear;close all;

x=[1,1,0,1,0,0,1,1,0,0
   0,1,1,0,0,1,1,1,0,1
   0,1,1,2,0,1,1,0,2,2];
y=[1,0,0,1,0,0,0,1,0,1];



x=x';
y=y';


[n,m]=size(x);%肯定x特徵維數m,
for i=1:m 
    C(i)=length(unique(x(:,i)));%肯定x每一個特徵的類數Ci;
end
uny=unique(y);
C(m+1)=length(uny);%肯定y的類數;

%-----------------------------計算先驗機率,條件機率------------------
for i=1:C(m+1)  %y的類別數
    num=find(y==uny(i));
    sumy(i)=sum(y==uny(i));
    py(i)=sumy(i)/n;%先驗機率P(Y=yi)
    
    xi=x(num,:);%y==yi下的x矩陣;
    for j=1:m   %x特徵變量個數
        unx{j}=unique(x(:,j));
        for k=1:C(j)  %x每一個特徵下的類別數
            pxy(k,j,i)=sum(xi(:,j)==unx{j}(k))/sumy(i);%條件機率矩陣,每一列爲yi條件下xi特徵的各種別的條件機率
        end
    end
end

%--------------------------------求後驗機率---------------------------
% unx uny pxy py  C

xx=[0;0;0];

sum=0;
for i=1:C(m+1)
    mul=1;
    for j=1:m
        j_n=unx{j}==xx(j);
        mul=mul*pxy(j_n,j,i);
    end
    pxx(i)=mul;    
    sum=sum+py(i)*pxx(i);            
end
p_b=sum;%分母,全機率

for i=1:C(m+1)
    mul=1;
    for j=1:m
        j_n=find(unx{j}==xx(j));
        mul=mul*pxy(j_n,j,i);
    end
    pxx(i)=mul;
    p_a=py(i)*pxx(i);%分子,聯合機率
    

    pyx(i)=p_a/p_b;
end

y_pre=max(pyx);%預測的最大機率
y_num=uny(unique(find(pyx==y_pre)));%預測最大機率的所屬類別

disp('預測爲:類別   機率')
disp([y_num,y_pre])
  • 附圖 image.png
相關文章
相關標籤/搜索