我正在尝试根据身体部位之间的角度聚类一些图像。
从每张图片中提取的特征是:
angle1 : torso - torso
angle2 : torso - upper left arm
..
angle10: torso - lower right foot
因此输入数据是大小为1057x10的矩阵,其中1057代表图像数量,10代表躯干部位的角度。 类似地,testSet是821x10矩阵。
我希望输入数据中的所有行都与88个集群进行聚类。 然后我将使用这些集群来查找TestData属于哪些集群?
在以前的作品中,我使用了K-Means clustering这非常简单。我们只要求K-Means将数据聚类为88个集群。并实现另一种计算测试数据中每一行与每个集群中心之间距离的方法,然后选择最小值。这是相应输入数据行的集群。
我有两个问题:
是否可以在MATLAB中使用SOM执行此操作? AFAIK SOM用于视觉聚类。但我需要知道每个集群的实际类,以便稍后通过计算它所属的集群来标记我的测试数据。
您有更好的解决方案吗?
答案 0 :(得分:16)
Self-Organizing Map (SOM)是一种聚类方法,被视为Artificial Neural Network (ANN)的无监督变体。它使用竞争性学习技术来训练网络(节点之间相互竞争,以显示对给定数据的最强激活)
您可以将SOM视为由互连节点网格(方形,六边形,..)组成,其中每个节点都是权重的N维向量(与我们想要的数据点相同的维度大小)群集)。
这个想法很简单;给定一个向量作为SOM的输入,我们找到它的节点 closet ,然后更新它的权重和相邻节点的权重,使它们接近输入向量的值(因此名称自组织) )。对所有输入数据重复此过程。
形成的聚类由节点如何组织自身并形成一组具有相似权重的节点隐式定义。它们很容易在视觉上看到。
SOM与K-Means algorithm类似,但不同之处在于我们没有强加固定数量的聚类,而是指定网格中我们希望它适应的节点的数量和形状我们的数据。
基本上,如果您有经过训练的SOM,并且想要对新的测试输入向量进行分类,则只需将其分配给网格上最近的(距离作为相似性度量)节点(最佳匹配单位 BMU),并作为预测给出属于该BMU节点的矢量的[多数]类。
对于MATLAB,您可以找到许多实现SOM的工具箱:
nctool
群集工具)。