MATLAB 聚类分析

聚类分析


在Statistics and Machine Learning Toolbox 有两种聚类方法:K-means聚类 分级群聚 :

K-means聚类

K-means聚类是一种分割方法,它将数据中的观察结果视为彼此之间有位置和距离的对象,并将对象划分为K个互斥集群。这样,每个集群中的对象彼此尽可能地靠近,而与其他集群中的对象尽可能地远离。每个集群的特征是它的质心,或中心点。当然,在聚类中使用的距离通常不代表空间距离。

分级群聚

分级群聚是通过创建集群树,在不同的距离范围内同时研究数据分组的一种方法。这些树不是K-Means中的单个集群集合,而是一个多级层次结构,其中一个级别的集群被连接为下一个更高级别的集群。这允许你在你的应用中决定集群的规模或级别。


使用K-Means聚类费舍尔的虹膜数据

函数kmeans执行K-Means聚类,使用一种迭代算法将对象分配给集群,以便在所有集群中,从每个对象到其集群质心的距离之和是最小的。

用在费希尔的虹膜数据上,kmeans将基于它们的萼片和花瓣的尺寸发现虹膜标本之间的自然分组。对于K-means集群,必须指定要创建的集群的数量

首先,加载数据并调用kmeans,将所需的集群数量设置为2,并使用平方欧氏距离。为了了解所产生的集群之间的分离程度,可用silhouette函数绘制一个剪影图。


load fisheriris  % 加载内置的费舍尔虹膜数据
[cidx2,cmeans2] = kmeans(meas,2,'dist','sqeuclidean');
[silh2,h] = silhouette(meas,cidx2,'sqeuclidean');

剪影图显示一个集群中的每个点与邻近集群中的点之间的距离。

2个集群剪影图/轮廓图
2个集群剪影图/轮廓图

从剪影图中可以看到,两个集群中的大多数点都有较大的剪影值,大于0.8,说明这些点与邻近的集群有很好的分离。然而,每个集群也包含一些低轮廓值的点,表明它们与来自其他集群的点相邻。

结果是,这些数据中的第四个测量值,即花瓣的宽度,与第三个测量值,花瓣的长度高度相关,所以前三个测量值的三维图可以很好地表示这些数据,而不用诉诸四维空间。如果对kmeans创建的每个集群使用不同的符号绘制数据,则可以将具有小轮廓值的点标识为与其他集群中的点接近的点。


ptsymb = {'bs','r^','md','go','c+'};
for i = 1:2
    clust = find(cidx2==i);
    plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
    hold on
end
plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'ko');
plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'kx');
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
两个集群的三维空间分布
两个集群的三维空间分布

每个集群的中心用圆圈X表示。来自下部集群的三个点(正方形)与来自上集群的三个点(三角形)非常接近。由于上部集群太过分散,这三个点更接近下部集群的中心而不是上部集群的中心,即使这些点与它们自己的集群中的大部分点之间有一个缺口。因为K-means聚类只考虑距离,而不考虑密度,所以会出现这种结果。


进一步分析

接下来,可以增加集群的数量,看看kmeans是否可以在数据中找到进一步的分组结构。这一次,使用可选的“Display”名称-值对参数打印出关于聚类算法中每次迭代的信息。

聚类算法中每次迭代的信息。
迭代信息

在每次迭代时,kmeans算法在集群之间重新分配点,以减少点到质心的距离之和,然后为新的集群分配重新计算集群中心。

请注意,每次迭代的总距离和重新分配的数量都会减少,直到算法达到最小值。kmeans算法包括两个阶段。在这里的示例中,算法的第2阶段没有进行任何重新分配,这表明第1阶段在经过几次迭代后达到了最小值。

默认情况下,kmeans使用一组随机选择的初始形心位置开始聚类过程。kmeans算法可以收敛到局部最小值;也就是说,kmeans可以对数据进行分区,以便将任何单点移动到不同的集群会增加总距离。然而,与许多其他类型的数值最小化一样,kmeans达到的解有时依赖于起始点。因此,对于数据,其他具有较低总距离的解(局部最小值)可以存在。可以使用可选的“Replicates”名称-值对参数来测试不同的解决方案。当指定多个复制时,kmeans从每个replicate随机选择的不同中心开始重复集群过程。然后,kmeans返回所有replicates中距离总和最小的解决方案。


[cidx3,cmeans3,sumd3] = kmeans(meas,3,'replicates',5,'display','final');
 replicate结果
replicate结果

结果表明,即使对于这个相对简单的问题,也存在非全局最小值。这五个复制中的每一个都是从一组不同的初始中心开始的。kmeans得到了两种不同的解决方案中的一种,这取决于它是从哪里开始的。然而,kmeans返回的最终解决方案是所有复制中距离总和最少的那个。第三个输出参数包含最佳解决方案的每个集群内的距离总和:


sum(sumd3)
ans = 78.8514

绘制剪影图:


[silh3,h] = silhouette(meas,cidx3,'sqeuclidean');
 三集群的剪影图
三集群的剪影图

这个三集群解决方案的剪影图表明,有一个集群分离得很好,其余两个集群不是很明显。

同样,绘制原始数据,以了解kmeans是如何将点分配给集群的:


for i = 1:3
    clust = find(cidx3==i);
    plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
    hold on
end
plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'ko');
plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'kx');
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
三个集群在空间中的分配
三个集群在空间中的分配

可以看到kmeans将上部的集群从两个集群解决方案中分离出来,并且这两个集群非常接近。根据对这些数据进行集群之后打算如何处理它们,这个三集群解决方案可能比之前的两集群解决方案更有用或更没用。

silhouette的第一个输出参数包含每个点的剪影值,可以使用它定量地比较两个解决方案。二集群解的平均silhouette值较大,说明单纯从vie的角度来看,是更好的答案:


[mean(silh2) mean(silh3)]
% 结果
ans =
    0.8504    0.7357

还可以使用不同的距离对这些数据进行集群。余弦距离可能对这些数据有意义,因为它会忽略测量值的绝对大小,而只考虑它们的相对大小。因此,两朵大小不同但花瓣和萼片形状相似的花,可能就平方欧几里得距离而言并不接近,但就余弦距离而言会很接近。


[cidxCos,cmeansCos] = kmeans(meas,3,'dist','cos');

绘制剪影图:


[silhCos,h] = silhouette(meas,cidxCos,'cos');
[mean(silh2) mean(silh3) mean(silhCos)]

ans =0.8504 0.7357 0.7491

三集群的余弦距离剪影图
三集群的余弦距离剪影图

而剪影图来看,这些簇似乎只比那些使用平方欧几里得距离发现的要好一点点:

注意:集群的顺序可能与前面的剪影图不同。这是因为kmeans是随机选择初始集群分配的。

通过绘制原始数据,可以看到使用两种不同距离创建的集群形状的差异。这两个解是相似的,但是当使用余弦距离时,上面的两个簇在原点的方向上被拉长:


for i = 1:3
    clust = find(cidxCos==i);
    plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
    hold on
end
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
三集群在空间上的分布,余弦距离
三集群在空间上的分布,余弦距离

这个图不包括星团的中心,因为相对于余弦距离的质心对应于原始数据空间中到原点的半直线。但是,可以绘制一个归一化数据点的平行坐标图,以可视化集群中心之间的差异。


lnsymb = {'b-','r-','m-'};
names = {'SL','SW','PL','PW'};
meas0 = meas ./ repmat(sqrt(sum(meas.^2,2)),1,4);
ymin = min(min(meas0));
ymax = max(max(meas0));
for i = 1:3
    subplot(1,3,i);
    plot(meas0(cidxCos==i,:)',lnsymb{i});
    hold on;
    plot(cmeansCos(i,:)','k-','LineWidth',2);
    hold off;
    title(sprintf('Cluster %d',i));
    xlim([.9, 4.1]);
    ylim([ymin, ymax]);
    h_gca = gca;
    h_gca.XTick = 1:4;
    h_gca.XTickLabel = names;
end

从这张图中可以清楚地看出,这三组标本的花瓣和萼片的平均相对大小明显不同。第一簇有严格小于萼片的花瓣。第二组的花瓣和萼片在大小上重叠,但是第三组的花瓣和萼片比第二组重叠得多。还可以看到,第二组和第三组包括一些彼此非常相似的标本。

因为我们知道数据中每个观察到的物种,你可以比较kmeans发现的集群和实际的物种,看看这三个物种是否有明显不同的物理特征。事实上,如下图所示,使用余弦距离创建的簇只在五种花上不同。这五个点,用型形绘制,都在上面两个集群的边界附近。

两个集群的边界

用分级集群聚类

参考下一篇: MATALB用分级集群聚类费舍尔虹膜数据






公众号

关注公众号,获取一手资讯

“ MATLAB 聚类分析 ” comments 0

评论/回复

电子邮件地址不会被公开。 必填项已用*标注