聚类可以定义为基于点之间的一些共性或相似性对数据点进行分组。
最简单的方法之一是 K-means 聚类。在这种方法中,簇的数量是初始化的,每个簇的中心是随机选择的。计算每个数据点与所有聚类中心之间的欧几里得距离,并基于每个数据点分配给某个聚类的最小距离。定义集群的新中心并计算欧几里得距离。该过程迭代直到达到收敛。
1、生成随机数据
首先让我们生成一些随机数据点和一些随机聚类点。
matlab参考代码
%Generate sample data points and assign random centre for each cluster
%Number of data points
sz=100;
sz1=250;
X = random('unid',sz1,[sz 1]); %Value
Xp = random('unid',sz1,[sz 1]); %Position
%Number of clusters
c=6;
V=random('unid',sz1,[c 1]); %Value
Vp=random('unid',sz1,[c 1]); %Position
figure,plot(Xp,X,'*',Vp,V,'r+');title('Data points and the initial Cluster centers');
生成100个数据点,假设聚类数为6,随机生成6个聚类点。
可视化效果如下
2、对数据点进行分组
matlab参考代码
%找到数据点和集群之间的最小距离
[mv,Gpos]=min(J,[],2);
CGroup=zeros([sz c]);
colr=colormap(jet(c));
figure(3),
for i = 1:c
Temp = find(Gpos==i);
CGroup(1:numel(Temp),i)=Temp;
V1(i,:)=mean(X(Temp));
Vp1(i,:)=mean(Xp(Temp));
Pos=ones(numel(Temp)*2,1)*Vp1(i);
Pos(2:2:end)=Xp(Temp);
Value=ones(numel(Temp)*2,1)*V1(i);
Value(2:2:end)=X(Temp);
%为每个集群定义新中心
plot(Pos,Value,'Color',colr(i,:),'LineStyle','-','Marker','o');hold on;
plot(Vp1(i),V1(i),'k+');
end
hold off;
Diffv=abs(V-V1);
DiffVp=abs(Vp-Vp1);
%迭代该过程直到集群位置没有变化
if(Diffv < 1)
flag=0;
else
V=V1;
Vp=Vp1;
end
end
figure,plot(Xp,X,'*',Vp,V,'g+');title('Data points and the Final Cluster centers');
最终迭代后簇的新位置(绿色十字)
在上图中,数据点以蓝色星形表示,聚类中心以绿色十字形表示。
3、计算过程描述
让我们考虑一个特定的数据点和所有的集群中心。
数据点位置 X = 13, Y = 20
簇1 位置 X = 8,Y = 19
簇 2 位置 X = 13,Y = 15
第 1 步:求欧几里得距离:
求数据点与簇1之间的欧几里德距离(D1),求数据点与簇 2 之间的欧几里德距离(D2
Distance D1 = sqrt((13-8).^2+(20-19).^2)) = 5.0990
Distance D2 = sqrt((13-13).^2+(20-15).^2))= 5.0000
第 2 步:找到最小值并将数据点分配给集群
现在两个结果之间的最小距离是集群 2。
因此 (X,Y)=(13,20) 的数据点被分配给集群/组 2。
第 3 步:对所有数据点执行第 1 步和第 2 步,并相应地分配组。
第 4 步:根据已完成的聚类为聚类分配新位置。
找到新分配的数据点到特定集群的平均位置,并将该平均值用作集群的新位置。
步骤 5:重复此过程,直到簇的位置不变。
4、结果可视化
聚类数为6的聚类结果,可以自行修改聚类数,以达到最适合的结果。
评论(0)
您还未登录,请登录后发表或查看评论