k折交叉验证matlab 流程 | 您所在的位置:网站首页 › k折交叉验证结果 › k折交叉验证matlab 流程 |
本帖最后由 小新1234 于 2019-12-28 10:45 编辑 [有偿]网络上下载了一个代码,用K折交叉验证法验证贝叶斯网络的准确性,代码不会调整,有没有大神帮忙看看哪里有问题 clear; clc; ex=importdata('test.txt'); %读入文件 X=ex.data; [m,n]=size(ex.textdata); %数据大小 Y=zeros(m); for i=1:m if strcmp(ex.textdata(i),'A')==1 Y(i)=1; elseif strcmp(ex.textdata(i),'B')==1 Y(i)=2; elseif strcmp(ex.textdata(i),'C')==1 Y(i)=3; elseif strcmp(ex.textdata(i),'D')==1 Y(i)=4; else Y(i)=5; end end %朴素贝叶斯算法实现分类问题(五类y=1,y=2,y=3,y=4,y=5) %我们把所有数字序号末尾为1的留作测试集,其他未训练集 % m=4113; %样本总数 % m1=562; %训练集样本数量 % m2=63; %测试集样本数量 %5折5次交叉验证 indices = crossvalind('Kfold',m,5); %产生5个fold,即indices里有等比例的1-5 accuracy = 0; for i=1:5 test=(indices==i); %逻辑判断,每次循环选取一个fold作为测试集 train=~test; %取test的补集作为训练集,即剩下的4个fold data_train=X(train, ; %以上得到的数都为逻辑值,用与样本集的选取 label_train=Y(train, ; %label为样本类别标签,同样选取相应的训练集 data_test=X(test, ; %同理选取测试集的样本和标签 label_test=Y(test, ; [l1,l3] = size(label_train); [l2,l4] = size(label_test); %5类样本数量分别记为count1,count2,count3,4,5 count1=0; count2=0; count3=0; count4=0; count5=0; %count_1(i,j)表示在第一类(y=1)的情况下,第i个属性是j的样本个数 count_1=zeros(4,5); %count_2(i,j)表示在第二类(y=2)的情况下,第i个属性是j的样本个数 count_2=zeros(4,5); %count_3(i,j)表示在第三类(y=3)的情况下,第i个属性是j的样本个数 count_3=zeros(4,5); count_4=zeros(4,5); count_5=zeros(4,5); ii=1;%用来标识测试集的序号 for i=1:l1 x=data_train(i, ; if label_train(i)==1 count1=count1+1; for j=1:4 %指示第j个属性 for k=1:5 %第j个属性为哪个值 if x(j)==k count_1(j,k)=count_1(j,k)+1; break; end end end elseif label_train(i)==2 count2=count2+1; for j=1:4 %指示第j个属性 for k=1:5 %第j个属性为哪个值 if x(j)==k count_2(j,k)=count_2(j,k)+1; break; end end end elseif label_train(i)==3 count3=count3+1; for j=1:4 %指示第j个属性 for k=1:5 %第j个属性为哪个值 if x(j)==k count_3(j,k)=count_3(j,k)+1; break; end end end elseif label_train(i)==4 count4=count4+1; for j=1:4 %指示第j个属性 for k=1:5 %第j个属性为哪个值 if x(j)==k count_4(j,k)=count_4(j,k)+1; break; end end end elseif label_train(i)==5 count5=count5+1; for j=1:4 %指示第j个属性 for k=1:5 %第j个属性为哪个值 if x(j)==k count_5(j,k)=count_5(j,k)+1; break; end end end end %分别计算三类概率y1=p(y=1)、y2=p(y=2)、y3=p(y=3)的估计值 y1=count1/l1; y2=count2/l1; y3=count3/l1; y4=count4/l1; y5=count5/l1; %y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值 %y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值 %y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值 for i=1:4 for j=1:5 y_1(i,j)=count_1(i,j)/count1; y_2(i,j)=count_2(i,j)/count2; y_3(i,j)=count_3(i,j)/count3; y_4(i,j)=count_4(i,j)/count4; y_5(i,j)=count_5(i,j)/count5; end end end %做预测,p1,p2,p3分别表示输入值xx为第1,2,3类的概率 cc=0; %用cc表示正确分类的样本 for i=1:l2 xx=data_test(i, ; yy=label_test(i); p1=y1*y_1(1,xx(1))*y_1(2,xx(2))*y_1(3,xx(3))*y_1(4,xx(4));——(这一步就运行不下去了) p2=y2*y_2(1,xx(1))*y_2(2,xx(2))*y_2(3,xx(3))*y_2(4,xx(4)); p3=y3*y_3(1,xx(1))*y_3(2,xx(2))*y_3(3,xx(3))*y_3(4,xx(4)); p4=y4*y_4(1,xx(1))*y_4(2,xx(2))*y_4(3,xx(3))*y_4(4,xx(4)); p5=y5*y_5(1,xx(1))*y_5(2,xx(2))*y_5(3,xx(3))*y_5(4,xx(4)); %下面分别输出三类的概率 %ans1=p1/(p1+p2+p3+p4+p5) %ans2=p2/(p1+p2+p3+p4+p5) %ans3=p3/(p1+p2+p3+p4+p5) %ans4=p4/(p1+p2+p3+p4+p5) %ans4=p5/(p1+p2+p3+p4+p5) if p1>p2&&p1>p3 ——(这一步没有改,我的是五类) if yy==1 cc=cc+1; end end if p2>p1&&p2>p3 if yy==2 cc=cc+1; end end if p3>p1&&p3>p2 if yy==3 cc=cc+1; end end end %拿训练集做测试集,得到的正确率 accur_per = cc/l2 accuracy = accuracy + accur_per; end accur_ave = accuracy/10 2019-12-27 22:00 上传 点击文件名下载附件 293.21 KB, 下载次数: 6 |
CopyRight 2018-2019 实验室设备网 版权所有 |