MATLAB:自组织映射(SOM)聚类

10
我正在尝试根据身体部位之间的角度对一些图像进行聚类。
提取自每个图像的特征为:
angle1 : torso - torso
angle2 : torso - upper left arm
..
angle10: torso - lower right foot

因此,输入数据是一个1057x10大小的矩阵,其中1057表示图像数量,10表示身体部位与躯干的角度。 类似地,testSet是一个821x10矩阵。
我希望将输入数据中的所有行聚类为88个簇。 然后我将使用这些簇来查找TestData属于哪些簇?
在以前的工作中,我使用了非常直接的K-Means聚类。我们只需请求K-Means将数据聚类为88个簇。并实现另一种方法,计算测试数据中每行与每个簇中心之间的距离,然后选择最小值。这是相应输入数据行的簇。
我有两个问题:
  1. 是否可以使用MATLAB中的SOM来完成此操作? 据我所知,SOM用于视觉聚类。但我需要知道每个簇的实际类别,以便稍后通过计算它属于哪个簇来标记我的测试数据。
  2. 您是否有更好的解决方案?

1
你为什么要使用88个聚类?SOM是什么?你的问题是从图像中找到身体部位之间的角度,还是聚类算法的问题? - Richie Cotton
1个回答

18

自组织映射(SOM)是一种聚类方法,被认为是人工神经网络(ANN)的无监督变体。它使用竞争性学习技术来训练网络(节点相互竞争以显示对给定数据的最强激活)

www.lohninger.com/helpcsuite/kohonen_network_-_background_information.htm

你可以将SOM看作由互相连接的节点网格(方形、六边形等)组成,其中每个节点是一个N维权重向量(与我们想要聚类的数据点具有相同的维度大小)。这个想法很简单:给定一个向量作为SOM输入,我们找到最接近它的节点,然后更新它的权重和相邻节点的权重,使它们接近于输入向量(因此称为自组织)。对所有输入数据重复这个过程。

plotsompos

形成的群集是由节点如何组织自己并形成具有相似权重的节点组隐式定义的。它们可以很容易地在视觉上看到。

plotsomnd

SOM在某种程度上类似于K-Means算法,但不同之处在于我们不会强制规定固定数量的聚类,而是指定我们想要它适应我们的数据的网格中节点的数量和形状。
基本上,当您拥有训练好的SOM并且想要对新的测试输入向量进行分类时,您只需将其分配给最近的(以距离作为相似性度量)网格节点(最佳匹配单元 BMU),并给出属于该BMU节点的向量的[多数]类作为预测。

plotsomhits

对于MATLAB,您可以找到一些实现SOM的工具箱:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接