基于COIL20数据集并计算评价指标NMI、ACC


  • 1.先对图片集进行处理
clear
clc
path = 'F:\Matlab\bin\kmeans_coil20\coil-20-proc\';     %源数据集路径
save_path = 'F:\Matlab\bin\kmeans_coil20\';     %处理之后保存的路径
file = dir([path,'*.png']);     %列出源路径下所有.png文件的信息:name date bytes...

COIL = [];
Label = [];
disp(length(file));
for i = 1:length(file)      %源路径下png文件的个数
    %%
    %%对图片本身数据做处理
    image0 = imread([path,file(i).name]);       %读取某一张图片
    str = file(i).name;     %图片名保存为str
    image1 = im2double(image0);     %将图片中unit8转换为double
    [a,b] = size(image1);       %a为图片行数 b为图片列数
    image2 = reshape(image1,1,a*b);     %将a*b的图片转换为1行
    COIL = [COIL;image2];       %每一张图片都加载在上一张图片的下一行
    fprintf('%d th starting...\n',i);       %记录程序运行过程
    %%
    %%对图片标签做处理 图片名为‘obj(类标签)__(拍摄角度).png’
    %主要提取类标签
    LabelStart = strfind(str,'j');      %找到图片名‘j’的位置(类标签前)
    LabelEnd = strfind(str,'_');        %找到图片名‘__’的位置(类标签后)
    label_temp = str2double(str(LabelStart+1:LabelEnd(1,1)-1));     %提取出图片类标签
    Label = [Label;label_temp];     %每个类标签按顺序排排坐
end

save COIL COIL
save Label Label
  • 2.计算acc及NMI参考了这篇
    https://blog.csdn.net/hgh19951014/article/details/103496747
  • 3.K-means
%% k=20 随机抽取二十个样本作为初始均值向量
n=1440;
m=16384;
k=20;
% flag保存随机选取的数字
flag=randperm(n,k);
% 将抽取的mu打上类标签
for i=1:k
    COIL(flag(i),m+1)=i;
end
mu=zeros(k,m);
for i=1:k
    for j=1:m
        mu(i,j)=COIL(flag(i),j);
    end
end
%% 计算欧式距离,选择最近的原型进行分簇
dis=zeros(n,k);
for i=1:n
    min=10000000;
    category = 1;
    for j=1:k
        tmp=0;
        for o=1:m
            tmp=tmp+(COIL(i,o)-mu(j,o)).^2;
        end
        dis(i,j)=sqrt(tmp);
        if dis(i,j)
  • 4.结果
    迭代2次

迭代10次