GNMF其中一步的matble程序详解
数据来源http://www.cad.zju.edu.cn/home/dengcai/Data/TextData.html
里面的
这个数据是一个文件项矩阵
解释的代码也是这个事例里面的
为了matble运行方便,将下载好的数据集放在matble的运行文件中
下面是matble代码
load('USPS')
faceW = 16;
faceH = 16;
numPerLine = 20;
ShowLine = 4;
Y = zeros(faceH*ShowLine,faceW*numPerLine);
for i=0:ShowLine-1
for j=0:numPerLine-1
Y(i*faceH+1:(i+1)*faceH,j*faceW+1:(j+1)*faceW) = reshape(fea(i*numPerLine+j+1,:),[faceH,faceW])';
end
end
imagesc(Y);colormap(gray);
运行即可得到,
load('USPS') %%导入USPS.mat数据文件,USPS.mat中包含了一个文本矩阵fea,与一个标记矩阵gnd。fea为 256X9298的矩阵
faceW = 16;
faceH = 16;
numPerLine = 20;
ShowLine = 4;
Y = zeros(faceH*ShowLine,faceW*numPerLine); %%设定了零矩阵Y,矩阵大小为faceH*ShowLine,faceW*numPerLine,即
16*4 X 16*20 的全零矩阵。
for i=0:ShowLine-1for j=0:numPerLine-1
Y(i*faceH+1:(i+1)*faceH,j*faceW+1:(j+1)*faceW) = reshape(fea(i*numPerLine+j+1,:),[faceH,faceW])';
end
end %%reshape()函数为转换函数,例如可以将3X4的矩阵转换为2X6的矩阵
%%Y(i*faceH+1:(i+1)*faceH,j*faceW+1:(j+1)*faceW),看着复杂,实际上是在原全零矩阵上截取一个这样大小的矩阵
%%这里举例说明:假设当i=0,j=0时,Y(i*faceH+1:(i+1)*faceH,j*faceW+1:(j+1)*faceW)就变为
%%Y(0*16+1:1*16,0*16+1:1*16) 整理后 Y(1:16,1:16)就表示截取原Y矩阵的前16行与前16列
%%同理 当i=0,j=1时 整理后Y(1:16,17:2*16),表示截取原Y矩阵的前16行,第二个16列,之后i,j不同取值,也依次类推。
%% fea(i*numPerLine+j+1,:),实际上表示fea矩阵的第i*numPerLine+j+1行,如果是fea(:,i*numPerLine+j+1) 则表示fea的第i*numPerLine+j+1列。
%%为了形象,举例说明,同上假设当i=0,j=0时:
Y(i*faceH+1:(i+1)*faceH,j*faceW+1:(j+1)*faceW) = reshape(fea(i*numPerLine+j+1,:),[faceH,faceW])'; 变为
Y(1:16,1:16)=reshape(fea(1,:),[16,16])‘,其含义就是将fea矩阵的第一行256的数据,按列放入16X16的矩阵,然后转置赋值给Y的第前16行X前16列上,因为默认按列放入。 ( 16*16正好等于fea的列256 )
依次到循环结束
如图最终只用了fea矩阵的前80行,通过最终的结果可以看出,fea矩阵的每一行聚类为一个数字。这是GNMF其中的一步。
imagesc(Y);colormap(gray);
%imagesc(A) 将矩阵A中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色。colormap 是用于控制曲面图的颜色。例如: colormap(gray) 输出一个灰色系的曲面图 当然你也可以选择其他色系。嘻嘻试过0到1,由黑到白。