貝葉斯定理: 全機率公式:p(x) = p(x/y1)p(y1)+p(x/y2)p(y2)+...p(x/yk)p(yk),其中(y1,y2,...yk)組成一個完備事件且之間相互獨立。算法
各個特徵之間相互獨立,其中各個特徵又分別爲離散的類別。 測試
- 計算訓練X各個特徵xi中某個類別xij在每一類yk下的條件機率:p(xij/yk),全部計算結果存爲三維矩陣Pxy(j,i,k)
- 計算各種yk的先驗機率 :p(yk),即該類在整體樣品中所佔的比例
- 再根據步驟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爲特徵維度。
- 依據貝葉斯公式計算出P(yk/x),排序選擇最大的類別。
%樸素貝葉斯 --- 分類算法 %假設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])