⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fenleiqijicheng.m

📁 朴素贝叶斯分类器
💻 M
字号:
clear;
clc;
load ('c301data.mat');
r1=r1';
r1=r1(1:70,:);
T=size(r1,1);
%%%%%%%%%%%%k叠交叉验证%%%%%%%%%%%%%
k=4;s=1;
tdata=r1(s:k:T,:);%测试数据包括分类好的决策属性值
r1(s:k:T,:)=[];
traindata=r1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[n N]=size(traindata);
[a1 a2]=Classification(traindata(:,N));%找到类变量分类的范围
[traindata A B]=guiyihua(traindata);
H1=[];H2=[];H3=[];
for i=1:n
    if traindata(i,N)>=a2 & traindata(i,N)<=1
           h1=i;
           H1=[H1;h1];
    elseif traindata(i,N)>=a1 & traindata(i,N)<a2
           h2=i;
           H2=[H2;h2];
    elseif traindata(i,N)>=0 & traindata(i,N)<a1
           h3=i;
           H3=[H3;h3];
    end
end
traindata=fanguiyihua(traindata,A,B);
%计算先验概率
c1=size(H1,1);c2=size(H2,1);c3=size(H3,1);
prior=[c1/n c2/n c3/n];
%计算第一类中的各个特征属性以及第一类的均值以及方差
means1=mean(traindata(H1,1:N));    %N表示列向量的个数
sigmapf1=var(traindata(H1,1:N)).*((c1-1)/c1);
m1=cov(traindata(H1,1:N-1)).*((c1-1)/c1);
%计算第二类中的各个特征属性以及第二类的均值以及方差
means2=mean(traindata(H2,1:N));
sigmapf2=var(traindata(H2,1:N)).*((c2-1)/c2);
m2=cov(traindata(H2,1:N-1)).*((c2-1)/c2);
%计算第三类中的各个特征属性以及第三类的均值以及方差
means3=mean(traindata(H3,1:N));
sigmapf3=var(traindata(H3,1:N)).*((c3-1)/c3);
m3=cov(traindata(H3,1:N-1)).*((c3-1)/c3);

means=[means1;means2;means3];
sigmapf=[sigmapf1;sigmapf2;sigmapf3];
sigma=sigmapf.^(1/2);

%相关系数lu
lu1=zeros(1,N-1);
for i=1:N-1 
    b1=traindata(H1,[i,N]);
    co1=cov(b1).*((c1-1)/c1);
    lu1(i)=abs(co1(1,2)/(sigma(1,i)*sigma(1,N)));%第一类的三个特征属性分别与自己的相关系数
end
lu2=zeros(1,N-1);
for i=1:N-1
    b2=traindata(H2,[i,N]);
    co2=cov(b2).*((c2-1)/c2);
    lu2(i)=abs(co2(1,2)/(sigma(2,i)*sigma(2,N)));
end
lu3=zeros(1,N-1);
for i=1:N-1
    b3=traindata(H3,[i,N]);
    co3=cov(b3).*((c3-1)/c3);
    lu3(i)=abs(co3(1,2)/(sigma(3,i)*sigma(3,N)));
end
lu=[lu1;lu2;lu3];
Lu=[];
Lu=sqrt(sigmapf(:,1:N-1).*(repmat(ones(1,N-1),[3,1])-lu.^2));

t1=sqrt(det(m1));
t2=sqrt(det(m2));
t3=sqrt(det(m3));
M1=means(1,1:N-1)';
M2=means(2,1:N-1)';
M3=means(3,1:N-1)';

%%%%%%%%%%%%%%%进入测试阶段%%%%%%%%%%%%%%
[TestSampleNum nn]=size(tdata);
Z=nn-1;
testdata=tdata(:,1:nn-1);
MM1=[];
for i=1:TestSampleNum%ij表示第i个数据属于第j类
    pxw1=[];pxw2=[];pxw3=[];
    for j=1:(nn-1)
        if testdata(i,j)>(means(1,j)-Lu(1,j)) & testdata(i,j)<(means(1,j)+Lu(1,j))
           pxw11=0.6844;
        elseif testdata(i,j)<=(means(1,j)-Lu(1,j)) & testdata(i,j)>=(means(1,j)-2*Lu(1,j)) | testdata(i,j)>=(means(1,j)+Lu(1,j)) & testdata(i,j)<=(means(1,j)+2*Lu(1,j))
           pxw11=0.2725;
        else
           pxw11=0.0431;
        end
        if testdata(i,j)>(means(2,j)-Lu(2,j)) & testdata(i,j)<(means(2,j)+Lu(2,j))
           pxw12=0.6844;
        elseif testdata(i,j)<=(means(2,j)-Lu(2,j)) & testdata(i,j)>=(means(2,j)-2*Lu(2,j)) | testdata(i,j)>=(means(2,j)+Lu(2,j)) & testdata(i,j)<=(means(2,j)+2*Lu(2,j))
           pxw12=0.2725;
        else
           pxw12=0.0431;
        end
        if testdata(i,j)>(means(3,j)-Lu(3,j)) & testdata(i,j)<(means(3,j)+Lu(3,j))
           pxw13=0.6844;
        elseif testdata(i,j)<=(means(3,j)-Lu(3,j)) & testdata(i,j)>=(means(3,j)-2*Lu(3,j)) | testdata(i,j)>=(means(3,j)+Lu(3,j)) & testdata(i,j)<=(means(3,j)+2*Lu(3,j))
           pxw13=0.2725;
        else
           pxw13=0.0431;
        end
        pxw1=[pxw1;pxw11];
        pxw2=[pxw2;pxw12];
        pxw3=[pxw3;pxw13];
    end
        P1=chengji(pxw1)*prior(1);
        P2=chengji(pxw2)*prior(2);
        P3=chengji(pxw3)*prior(3);
        MM1=[MM1;[P1 P2 P3]];
end 
MM1=MM1./repmat(sum(MM1,2),[1,3]);
[o1 ind1] = max(MM1, [], 2);

MM2=[];
for i=1:TestSampleNum%ij表示第i个数据属于第j类
    pxw1=[];pxw2=[];pxw3=[];
    for j=1:(nn-1)
        pxw11=normpdf(testdata(i,j),means(1,j),sqrt(sigmapf(1,j)*(1-lu(1,j)^2)));
        pxw12=normpdf(testdata(i,j),means(2,j),sqrt(sigmapf(2,j)*(1-lu(2,j)^2)));
        pxw13=normpdf(testdata(i,j),means(3,j),sqrt(sigmapf(3,j)*(1-lu(3,j)^2)));
        pxw1=[pxw1;pxw11];
        pxw2=[pxw2;pxw12];
        pxw3=[pxw3;pxw13];
    end
        P1=chengji(pxw1)*prior(1);
        P2=chengji(pxw2)*prior(2);
        P3=chengji(pxw3)*prior(3);
        MM2=[MM2;[P1 P2 P3]];
end
MM2=MM2./repmat(sum(MM2,2),[1,3]);
[o2 ind2] = max(MM2, [], 2);

MM3=[];
for j=1:TestSampleNum
    f1=exp(-((testdata(j,1:Z))'-M1)'*inv(m1)*((testdata(j,1:Z))'-M1)/2)*1/((2*pi)^(3/2)*t1);
    f2=exp(-((testdata(j,1:Z))'-M2)'*inv(m2)*((testdata(j,1:Z))'-M2)/2)*1/((2*pi)^(3/2)*t2);
    f3=exp(-((testdata(j,1:Z))'-M3)'*inv(m3)*((testdata(j,1:Z))'-M3)/2)*1/((2*pi)^(3/2)*t3);
    p1=f1*prior(1);
    p2=f2*prior(2);
    p3=f3*prior(3);
    MM3=[MM3;p1 p2 p3];
end
MM3=MM3./repmat(sum(MM3,2),[1,3]);
[o3 ind3] = max(MM3, [], 2);

MM=MM1+MM2+MM3;
[o ind] = max(MM, [], 2);

tdata(:,nn)=guiyihua1(tdata(:,nn),A(N),B(N));
for i=1:TestSampleNum
   if tdata(i,nn)>=a2 & tdata(i,nn)<=1
    tdata(i,nn)=1;
   elseif tdata(i,nn)>=a1 & tdata(i,nn)<a2
    tdata(i,nn)=2;
   elseif tdata(i,nn)>=0 & tdata(i,nn)<a1
    tdata(i,nn)=3;
   end
end
 
Err_ind = find(tdata(:,nn)~=ind);
E=size(Err_ind,1);
Correctrate=(TestSampleNum-E)/TestSampleNum;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -