2

我使用 k-means 对面部表情进行分类的方法是:

  1. 使用opencv检测图像中的人脸
  2. 使用 ASM 和 stasm 获取面部特征点
  3. 计算面部特征之间的距离(如图所示)。会有5个距离。在此处输入图像描述
  4. 计算每个面部表情的每个距离的质心(exp:在距离 D1 中,每个表情“快乐、愤怒……”有 7 个质心)。
  5. 使用 5 个 k-means,每个 k-means 表示一个距离,每个 k-means 作为结果将具有由最接近第一步计算的质心的距离显示的表达式。
  6. 最终表达式将是出现在最多 k-means 结果中的表达式

但是,使用这种方法我的结果是错误的?我的方法是正确的还是某处有问题?

4

1 回答 1

3

K-means 不是分类算法。运行后,它只是找到 K 个元素的质心,因此它将数据拆分为 K 个部分,但在大多数情况下,它与所需的类没有任何关系。当您想要探索数据并找到一些可区分的对象时,应该使用此算法(与所有聚类方法一样) 。在任何意义上都可以区分。如果您的任务是构建一个识别某些给定类的系统,那么这是一个分类问题,而不是聚类问题。KNN是最简单、易于实现和理解的方法之一(K-nearest neighbours),它大致完成了您想要完成的任务 - 检查哪些类的对象与某些预定义的对象最接近。

为了更好地了解差异,让我们考虑您的情况 - 您正在尝试根据面部特征检测情绪状态。在此类数据上运行 k-means 可以将您的面部照片分成许多组:

  • 如果您使用不同人的照片,它可以将特定人的照片聚集在一起(因为他们的距离与其他人不同)
  • 它可以将数据拆分为例如男人和女人,因为这些特征存在性别差异
  • 它甚至可以根据与相机的距离分割您的数据,因为视角会改变您的特征,从而创建“集群”。
  • 等等

如您所见,有几十种可能的“合理”(甚至更完全不可解释)分裂,K-means(和任何)其他聚类算法只会找到其中一个(在大多数情况下 - 不可解释的分裂)。分类方法用于克服这个问题,以“解释”算法您的期望。

于 2013-09-05T13:27:55.740 回答