上一篇文章介绍了互信息矩阵的建立
这篇文章主要讲一下矩阵的二值化
矩阵二值化
对于一个MI矩阵来说,二值化就是选择一个合适的阈值,如果MI值大于阈值,则记为1,如果MI值小于阈值,则记为0 。按照此方法,依次处理矩阵中的每个值,就能得到二值矩阵。
在解决该问题时遇到的难点和问题
观察得到的MI矩阵可以发现,不同被试者不同次实验中,有些实验数据差别较大,所以重点就在于阈值的选择。
- 刚开始是这样处理的(后来没用这个方法):
计算了所有MI矩阵中MI的平均值,暂且把这个值叫做“平均MI”,我用这个平均MI作为阈值,对所有矩阵进行了二值化。但是观察二值矩阵发现,很多矩阵出现了全0或者全1的情况。这样的话,对于后面提取网络属性就会有很大误差,所以这个方法被遗弃了。 - 后来采用的方法:
观察MI矩阵的数据发现,MI的值分布在0.66~0.85之间,所以我在这之间,以0.01为步长,设置了20个阈值,以此对MI矩阵进行二值化。这样,每个MI矩阵就会得到20个二值矩阵,将他们都进行保存。
后面计算每个MI矩阵的网络属性时,也是在这20个二值矩阵上分别计算,之后再取平均值,作为最终的网络属性值。
部分代码如下
pathname1='E:\MI矩阵\';
pathname3='E:\二值化矩阵修改\';
%32个被试者
for k=1:32
if k<10
filename1=sprintf('s0%d\\',k);
end
if k>=10
filename1=sprintf('s%d\\',k);
end
pathname2=[pathname1,filename1];
pathname4=[pathname3,filename1];
mkdir(pathname3,filename1);
%每人40次试验
for j=1:40
if k<10
filename2=sprintf('s0%d-%d',k,j);
filename3=sprintf('s0%d-%d\\',k,j);
end
if k>=10
filename2=sprintf('s%d-%d',k,j);
filename3=sprintf('s%d-%d\\',k,j);
end
mkdir(pathname4,filename3);
pathname5=[pathname4,filename3];
xx=load([pathname2,filename2]);
labels=xx.labels;
value=0.66; %初始的阈值,每次增加0.01,直到0.85,共20个
for i=1:20
filename4=sprintf('%d',i);
Theta.MI1=traverse(xx.Theta.MI1,value);
Theta.MI2=traverse(xx.Theta.MI2,value);
Alpha.MI1=traverse(xx.Alpha.MI1,value);
Alpha.MI2=traverse(xx.Alpha.MI2,value);
Beta1.MI1=traverse(xx.Beta1.MI1,value);
Beta1.MI2=traverse(xx.Beta1.MI2,value);
Beta2.MI1=traverse(xx.Beta2.MI1,value);
Beta2.MI2=traverse(xx.Beta2.MI2,value);
save([pathname5,filename4],'Theta','Alpha','Beta1','Beta2','labels');
value=value+0.01;
end
end
end
该文章是学习笔记,后续会继续更新
下一篇文章的链接:基于互信息的EEG脑网络情感识别(六)