基于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次