% k-mean 聚类算法
% main variables
dim = 2; % 模式样本维数
k = 4; % 设有 k 个聚类中心
load('testSet.txt');
PM=testSet;% 模式样本矩阵
N = size(PM,1);
figure();
subplot(1,2,1);
for(i=1:N)
plot(PM(i,1),PM(i,2), '*r'); % 绘出原始的数据点
hold on
end
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
CC = zeros(k,dim); % 聚类中心矩阵,CC(i,:)初始值为 i 号样本向量
D = zeros(N,k); % D(i,j)是样本 i 和聚类中心 j 的距离
C = cell(1,k); %% 聚类矩阵,对应聚类包含的样本。初始状况下,聚类 i(i
t1 = t1(2:length(t1));
C{B(i)} = t1;
C{t} = [C{t},i]; % 将 i 加入第 t 类
B(i) = t;
end
end
if change == 0 %分类结果无变化,则迭代停止
break;
end
% 重新计算聚类中心矩阵 CC
for i = 1:k
CC(i,:) = 0;
iclu = C{i};
for j = 1:length(iclu)
CC(i,:) = PM( iclu(j),: )+CC(i,:);
end
CC(i,:) = CC(i,:)/length(iclu);
end
end
subplot(1,2,2);
plot(CC(:,1),CC(:,2),'o')
hold on
for(i=1:N)
if(B(1,i)==1)
plot(PM(i,1),PM(i,2),'*b'); %作出第一类点的图形
hold on
elseif(B(1,i)==2)
plot(PM(i,1),PM(i,2), '*r'); %作出第二类点的图形
hold on
elseif(B(1,i)==3)
plot(PM(i,1),PM(i,2),'*g'); %作出第三类点的图形
hold on
else
plot(PM(i,1),PM(i,2), '*m'); %作出第四类点的图形
hold on
end
end
xlabel('X');
ylabel('Y');
title('聚类之后的数据点'); % 打印 C,CC
for i = 1:k %输出每一类的样本点标号
str=['第' num2str(i) '类包含点: ' num2str(C{i})];
disp(str);
end;