我正在尝试根据身体部位之间的角度对一些图像进行聚类。
从每个图像中提取的特征是:
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个聚类。并实现另一种方法,该方法计算测试数据中的每一行与每个群集的中心之间的距离,然后选择最小值。这是相应输入数据行的集群。
我有两个问题:
- 是否可以在MATLAB中使用SOM做到这一点? AFAIK SOM用于视觉集群。但是我需要知道每个群集的实际类,以便以后可以通过计算它属于哪个群集来标记测试数据。
- 您有更好的解决方案吗?
回答:
自组织映射(SOM)是一种被视为
人工神经网络(ANN)的无监督变异的聚类方法。它使用
竞争性学习技术来训练网络(节点相互竞争以显示对给定数据的最强激活)
您可以认为SOM好像是由相互连接的节点(正方形,六边形等)的网格组成,其中每个节点都是权重的N维矢量(尺寸大小与我们要聚类的数据点相同)。
这个想法很简单;给定一个向量作为输入到SOM,我们找到节点
衣柜里 ,然后更新其权重和邻居节点的权重,因此他们的做法,即输入向量的(因此得名自组织)。对所有输入数据重复此过程。
通过节点如何组织自身并形成具有相似权重的一组节点来隐式定义形成的群集。他们可以很容易地在视觉上看到。
SOM在某种程度上类似于
K-Means算法,但不同之处在于我们没有施加固定数量的集群,而是指定了网格中我们希望其适应数据的节点的数量和形状。
基本上,当您拥有训练有素的SOM并希望对新的测试输入向量进行分类时,只需将其分配到网格(
最佳匹配单元 BMU)上最近的(距离作为相似性度量)节点,然后将[属于该BMU节点的向量类别。
对于MATLAB,您可以找到许多实现SOM的工具箱:
更多&回答...