📄 all.m
字号:
clear all
tic
k=3; %类别数
x=xlsread('Iris.xls');
[n,d] = size(x);
nc=[x(1,:);x(51,:);x(121,:)]; %初始聚类中心
cid = zeros(1,n); %用于存储聚类结果
oldcid = ones(1,n);
nr = zeros(1,k);
maxgn= 100; %最大迭代次数
iter = 1;
while iter < maxgn
for i = 1:n %计算每个数据到聚类中心的距离
dist = sum((repmat(x(i,:),k,1)-nc).^2,2);
[m,ind] = min(dist); %将当前聚类结果存入cid中
cid(i) = ind;
end
for i = 1:k
ind = find(cid==i);%找到每一类的所有数据,计算他们的平均值,作为下次计算的聚类中心
nc(i,:) = mean(x(ind,:));
nr(i) = length(ind); % 统计每一类的数据个数
end
iter = iter + 1;
end
maxiter = 2;
iter = 1;
move = 1;
while iter < maxiter & move ~= 0
move = 0;
for i = 1:n % 对所有的数据进行再次判断,寻求最佳聚类结果
dist = sum((repmat(x(i,:),k,1)-nc).^2,2);
r = cid(i); % 将当前数据属于的类给r
dadj = nr./(nr+1).*dist'; % 计算调整后的距离
[m,ind] = min(dadj); % 找到该数据距哪个聚类中心最近
if ind ~= r % 如果不等则聚类中心移动
cid(i) = ind; % 将新的聚类结果送给cid
ic = find(cid == ind); % 重新计算调整当前类别的聚类中心
nc(ind,:) = mean(x(ic,:));
move = 1;
end
end
iter = iter+1;
end
centers = nc;
for ii=1:3
c=0;
for i=(50*(ii-1)+1):(50*ii)
if(cid(i)==ii) % 判断分到第一类中的样本是否正确
c=c+1; % C记录分类正确的个数
end
end
str=num2str(ii);
s=(c/50)*100; % 求第一类分类正确的百分比
s=num2str(s);
disp(['第',str,'类的分类正确率为:',s,'%']);
end
disp('属于第一类的数据有:{')
j=1;
for i=1:150,
if cid(i)==1,
p1(j)=i; %将属于第一类的数据写入数组p1,便于输出
j=j+1;
end
end
disp(p1)
disp('}')
disp('属于第二类的数据有:{')
j=1;
for i=1:150,
if cid(i)==2,
p2(j)=i; %将属于第二类的数据写入数组p2,便于输出
j=j+1;
end
end
disp(p2)
disp('}')
disp('属于第三类的数据有:{')
j=1;
for i=1:150,
if cid(i)==3,
p3(j)=i; %将属于第三类的数据写入数组p3,便于输出
j=j+1;
end
end
disp(p3)
disp('}')
t4=toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -