4.樸素貝葉斯分類器實現-matlab
阿新 • • 發佈:2019-01-06
實現樸素貝葉斯分類器,並且根據李航《統計機器學習》第四章提供的資料訓練與測試,結果與書中一致
分別實現了樸素貝葉斯以及帶有laplace平滑的樸素貝葉斯
%書中例題實現樸素貝葉斯 %特徵1的取值集合 A1=[1;2;3]; %特徵2的取值集合 A2=[4;5;6];%S M L AValues={A1;A2}; %Y的取值集合 YValue=[-1;1]; %資料集和 T=[ 1,4,-1; 1,5,-1; 1,5,1; 1,4,1; 1,4,-1; 2,4,-1; 2,5,-1; 2,5,1; 2,6,1; 2,6,1; 3,6,1; 3,5,1; 3,5,1; 3,6,1; 3,6,-1]; %訓練帶Laplace平滑的樸素貝葉斯模型 ltheta = LaplaceNBtrain(T(:, 1:size(T, 2) - 1), T(:, size(T, 2)), AValues, YValue, 1); %訓練樸素貝葉斯模型 theta = NBtrain(T(:, 1:size(T, 2) - 1), T(:, size(T, 2)), AValues, YValue); %測試兩個資料與書中答案相符 ans = NBtest(theta, [2,4;], AValues, YValue) lans = NBtest(ltheta, [2,4;], AValues, YValue) function y = NBtest(theta, X, AValues, YValue) Xindice=ones(size(X, 1), size(X, 2)); %找到特徵在取值集合中的下標,將X矩陣轉化為下標矩陣 for j=1:1:size(X, 2) AXi = AValues{j, 1}; for i=1:1:size(X, 1) for t=1:1:size(AXi, 1) if(X(i, j) == AXi(t, 1)) Xindice(i, j) = t; break end end end end %矩陣用於記錄所有X在不同Yi下的P(X|Y)P(Y) Ys = zeros(size(X, 1), size(YValue, 1)); PX_Y = theta{1,1}; PY = theta{2,1}; for i=1:1:size(Ys, 1) x=Xindice(i, :); for k=1:1:size(Ys, 2) ans = PY(k, 1); for j=1:1:size(x, 2) ans = ans * PX_Y{k, j}(x(1, j), 1); end Ys(i, k) = ans; end end Ys %後驗概率最大化 y=zeros(size(Ys, 1), 1); for i=1:1:size(Ys, 1) max = -1; max_indice = 0; for j=1:1:size(Ys, 2) if(Ys(i, j) > max) max = Ys(i, j); max_indice = j; end end y(i, 1) = YValue(max_indice, 1); end end function theta=NBtrain(X,Y,AValues,YValue) %計算先驗概率 TY = zeros(size(YValue, 1), 1); for i=1:1:size(Y, 1) for j=1:1:size(YValue) if(Y(i, 1) == YValue(j, 1)) Y(i,1); TY(j, 1) = TY(j, 1) + 1; break end end end PY = TY/size(Y, 1); %計算條件概率 pX_Y=cell(size(YValue, 1), size(X, 2)); for k=1:1:size(YValue, 1) %條件y=yk for i=1:1:size(X, 2) %i為特徵編號 %取得第i個特徵的取值集合 XAi = AValues{i, 1}; TXij_Y = zeros(size(XAi, 1), 1); for j=1:1:size(XAi, 1) %查詢資料中所有Y=yk且特徵i的值為Aij的資料個數並累加 for t=1:1:size(X, 1) if(Y(t, 1)==YValue(k, 1) && X(t, i) == XAi(j, 1)) TXij_Y(j, 1) = TXij_Y(j, 1) + 1; end end end PX_Y{k, i} = TXij_Y/TY(k, 1); end end theta = cell(2,1); theta{1,1} = PX_Y; theta{2,1} = PY; end function theta=LaplaceNBtrain(X,Y,AValues,YValue,lambda) %計算先驗概率 TY = zeros(size(YValue, 1), 1); for i=1:1:size(Y, 1) for j=1:1:size(YValue) if(Y(i, 1) == YValue(j, 1)) Y(i,1); TY(j, 1) = TY(j, 1) + 1; break end end end PY = (TY + lambda)/(size(Y, 1) + lambda * size(YValue, 1)); %計算條件概率 pX_Y=cell(size(YValue, 1), size(X, 2)); for k=1:1:size(YValue, 1) %條件y=yk for i=1:1:size(X, 2) %i為特徵編號 %取得第i個特徵的取值集合 XAi = AValues{i, 1}; TXij_Y = zeros(size(XAi, 1), 1); for j=1:1:size(XAi, 1) %查詢資料中所有Y=yk且特徵i的值為Aij的資料個數並累加 for t=1:1:size(X, 1) if(Y(t, 1)==YValue(k, 1) && X(t, i) == XAi(j, 1)) TXij_Y(j, 1) = TXij_Y(j, 1) + 1; end end end PX_Y{k, i} = (TXij_Y + lambda)/(TY(k, 1) + lambda * size(XAi, 1)); end end theta = cell(2,1); theta{1,1} = PX_Y; theta{2,1} = PY; end