k折交叉验证matlab 流程 您所在的位置:网站首页 k折交叉验证结果 k折交叉验证matlab 流程

k折交叉验证matlab 流程

2023-03-11 06:09| 来源: 网络整理| 查看: 265

本帖最后由 小新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 实验室设备网 版权所有