代码:
X=[35 35
41 49
35 17
55 45
55 20
15 30
25 30
20 50
10 43
55 60
30 60
20 65
50 35
30 25
15 10
30 5
10 20
5 30
20 40
15 60 %20
45 65
45 20
45 10
55 5
65 35
65 20
45 30
35 40
41 37
64 42 %30
40 60
31 52
35 69
53 52
65 55
63 65
2 60
20 20
5 5
60 12 ];%40
%定义多个聚类中心的符号变量,其中Z11为第一次迭代第一类聚类中心,Z22为第二次迭代第二类聚类中心
N = size(X,1); %样本点
NC_MAX=10; %设置最大迭代次数
for i=1: NC_MAX
syms (['Z1',num2str(i)]); %生成变量名
syms (['Z2',num2str(i)]);
end
%选择X1,X2为初始聚类中心
Z11= X(1,:); Z21= X(2,:);
%寻找新的聚类函数的函数,包括样本点到中心的距离计算,样本点分类以及求均值,详细见函数体定义
[Z12,Z22,c]=Find_Center(X,Z11,Z21);
%判断第一轮迭代和初始聚类中心是否相等,不相等则进行第二轮迭代,
for i=2: NC_MAX
checkEnd1 = all(eval(['Z1' int2str(i)'==Z1' int2str(i-1)]));
checkEnd2 = all(eval(['Z2' int2str(i) '==Z2'int2str(i-1)]));
if ~(checkEnd1&checkEnd2)
eval(['[Z1',int2str(i+1),',Z2',int2str(i+1),',c]=Find_Center(X,Z1', int2str(i),',Z2', int2str(i),')']);
else
break;
end
end
%对S1、S2进行分类
j=1;k=1;
for i=1:N
if c(i)==1 %其中c=D1
S1(j,:)=X(i,:); %归类
j=j+1;
else
S2(k,:)=X(i,:);
k=k+1;
end
end
plot(X(:,1),X(:,2),'k.');axis([0 100 0 100]);%绘图
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%求新聚类中心的函数
function [Z12,Z22,c]=Find_Center(X,Z11,Z21)
%计算样本点到聚类中心距离
N = n=size(X,1); %样本点
for i=1:N
D1(i)=distance(X(i,:),Z11);
end
for j=1:N
D2(j)=distance(X(j,:),Z21);
end
%D1、D2距离比较
c=D1
%计算各类样本数
N1=length(find(c==1))
N2=N-N1;
%直接求下一个聚类中心点
Z12=[0,0]; Z22=[0,0]; %新聚类中心初始化
for i=1:N
if c(i)==1
Z12=Z12+X(i,:); %第一类样本点累加
else
Z22=Z22+X(i,:); %第二类样本点累加
end
end
Z12=Z12/N1; %求均值
Z22=Z22/N2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%