📄 sctu.m
字号:
function[tree,cacu,nn]=sctu(trt,trf,train_t,train_f,l)
infor=zeros(l,l);
num_i=l*(l-1)/2; %计算的互信息的个数
for i=1:l %计算属性之间的互信息
for j=(i+1):l
[h,num_t,num_f]=caculatei(trt,trf,train_t,train_f,l,i,j);
infor(i,j)=h;
end
end
tree=zeros(l,l);%边的邻接矩阵
for m=1:l
vv(m)=1; %vv表示节点集合,为0的结点是没有添加到贝叶斯树中的结点
end
vv(1)=0; %表示将表示属性1的结点添加到贝叶斯树中
vl(1,1)=1;
vl(2,1)=1;
vl(3,1)=-1;
for m=2:l
vl(1,m)=1;
vl(2,m)=m;
vl(3,m)=infor(1,m); %vl里保存的是与树节点集合相邻结点最大权重边,第一行中结点为树节点,第二行中结点为非树节点
end
while equal_jz(vv,zeros(1,l))==0
max=-1;
max_v=0;
max_u=0;
for m=1:l %寻找与树节点相关信息最大的结点,即寻找以树节点为一个端点的最大权重的边
if vl(3,m)>max
max_v=vl(1,m);
max_u=vl(2,m);
max=vl(3,m);
end
end
vv(max_u)=0; %将寻找的最大权重边的另一点添加入树节点集合中
vl(3,max_u)=-1;
tree(max_v,max_u)=1; %将寻找的最大权重边添加到树中,保存在边的邻接矩阵中
for m=1:l %更新vl信息,vl里保存的是与树节点集合相邻结点最大权重边,第一行中结点为树节点,第二行中结点为非树节点
if vv(m)~=0
if infor(max_u,m)>vl(3,m)
vl(1,m)=max_u;
vl(2,m)=m;
vl(3,m)=infor(max_u,m);
elseif infor(m,max_u)>vl(3,m)
vl(1,m)=max_u;
vl(2,m)=m;
vl(3,m)=infor(m,max_u);
end
end
end
end
for n=1:l %将无向无环图转换为有向无环图,即树,tree为生成树的邻接矩阵~
uu(n)=n;
end
for m=1:l
for n=1:l
if tree(m,n)==1
tree(n,m)=1;
elseif tree(n,m)==1
tree(m,n)=1;
end
end
end
uu(1)=0;
vv(1)=1;
nn=0;
while equal_jz(uu,zeros(1,l))==0 %cacu表示通过树结构得到的需要计算的条件概率,其中分类属性省略表示
for m=1:l
if vv(m)~=0
for n=1:l
if tree(m,n)==1&vv(n)==0
tree(m,n)=1;
tree(n,m)=-1;
nn=nn+1;
cacu(1,nn)=m;
cacu(2,nn)=n;
uu(n)=0;
vv(n)=n;
end
end
vv(m)=0;
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -