基于 Bayes 分类的 MATLAB 程序
%题中所给各类样本数据及观察 x
w1=[0 0;2 1;1 0];w2=[-1,1;-2,0;-2,-1];w3=[0,-2;0,-1;1,-2];
x=[-2,2]';
syms x1 x2
Xr=[x1,x2];Xc=[x1;x2];
%算出各类状态的先验概率,
samplenum=length(w1)+length(w2)+length(w3);
p1=length(w1)/samplenum;
p2=length(w2)/samplenum;
p3=length(w3)/samplenum;
%算出各类的均值,协方差,及协方差的逆矩阵.
u1=mean(w1)';u2=mean(w2)';u3=mean(w3)';
D1=cov(w1);D2=cov(w2);D3=cov(w3);
invD1=inv(D1);invD2=inv(D2);invD3=inv(D3);
%在三类协方差不相等时,分别计算观察 x 的 gi(x) i=1,2,3;决定观察 x 属于的类别.
g1=-1/2*(x-u1)'*invD1*(x-u1)-1/2*log(det(D1))+log(p1);
g2=-1/2*(x-u2)'*invD2*(x-u2)-1/2*log(det(D2))+log(p2);
g3=-1/2*(x-u3)'*invD3*(x-u3)-1/2*log(det(D3))+log(p3);
g=[g1,g2,g3];
w=find(g==max(g));
fprintf('协方差不相等时,x belongs to W%d\n',w);
%求出三类相邻区域的分界线方程.
W1=-0.5*invD1;W2=-0.5*invD2;W3=-0.5*invD3;
ww1=invD1*u1;ww2=invD2*u2;ww3=invD3*u3;
w10=-1/2*u1'*invD1*u1-1/2*log(det(D1))+log(p1);
w20=-1/2*u2'*invD2*u2-1/2*log(det(D2))+log(p2);
w30=-1/2*u3'*invD3*u3-1/2*log(det(D3))+log(p3);
%W1 与 W2 的分界线.
rear=w10-w20;
g12=Xr*round(W1-W2)*Xc+(ww1-ww2)'*Xc+rear;
g12=simple(g12);
%W1 与 W3 的分界线.
rear=w10-w30;
g13=Xr*round(W1-W3)*Xc+(ww1-ww3)'*Xc+rear;
g13=simple(g13);
%W2 与 W3 的分界线.
rear=w20-w30;
g23=Xr*round(W2-W3)*Xc+(ww2-ww3)'*Xc+rear;
g23=simple(g23);
%绘制各类数据点及分界线.
subplot(2,2,1)
plot(w1(:,1),w1(:,2),'b+',w2(:,1),w2(:,2),'r*',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g12)
ezplot(g13)
ezplot(g23)
title('各类间混合分界线')
subplot(2,2,2)
plot(w1(:,1),w1(:,2),'b+',w2(:,1),w2(:,2),'r*')
hold on
ezplot(g12)
legend('第一类','第二类','分界线')
subplot(2,2,3)
plot(w1(:,1),w1(:,2),'b+',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g13)
legend('第一类','第三类','分界线')
subplot(2,2,4)
plot(w2(:,1),w2(:,2),'r*',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g23)
legend('第二类','第三类','分界线')
%三类协方差相等时,分别计算观察 x 的 gi(x) i=1,2,3;决定观察 x 属于的类别.
D=D1+D2+D3;invD=inv(D);
g1=(x-u1)'*invD*(x-u1);
g2=(x-u2)'*invD*(x-u2);
g3=(x-u3)'*invD*(x-u3);
g=[g1,g2,g3];
w=find(g==min(g));
fprintf('协方差相等时,x belongs to w%d',w);
W12=invD*(u1-u2);W13=invD*(u1-u3);W23=invD*(u2-u3);
x120=1/2*(u1+u2)-(log(p1/p2)*(u1-u2))/((u1-u2)'*invD*(u1-u2));
x130=1/2*(u1+u3)-(log(p1/p3)*(u1-u3))/((u1-u3)'*invD*(u1-u3))
x230=1/2*(u2+u3)-(log(p2/p3)*(u2-u3))/((u2-u3)'*invD*(u2-u3))
%求出三类相邻区域的分界线方程.
g12=W12'*(Xc-x120);
g12=simple(g12);
g13=W13'*(Xc-x130);
g13=simple(g13);
g23=W23'*(Xc-x230);
g23=simple(g23);
%绘制各类数据点及分界线.
figure(2)
subplot(2,2,1)
plot(w1(:,1),w1(:,2),'b+',w2(:,1),w2(:,2),'r*',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g12)
ezplot(g13)
ezplot(g23)
title('各类间混合分界线')
subplot(2,2,2)
plot(w1(:,1),w1(:,2),'b+',w2(:,1),w2(:,2),'r*')
hold on
ezplot(g12)
legend('第一类','第二类','分界线')
subplot(2,2,3)
plot(w1(:,1),w1(:,2),'b+',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g13)
legend('第一类','第三类','分界线')
subplot(2,2,4)
plot(w2(:,1),w2(:,2),'r*',w3(:,1),w3(:,2),'k.')
hold on
ezplot(g23)
legend('第二类','第三类','分界线')