如何对抗K均值聚类引起的随机性

时间:2013-09-07 15:09:58

标签: machine-learning computer-vision cluster-analysis k-means

我正在开发一种算法,根据图像数据对不同类型的狗进行分类。该算法的步骤是:

  1. 浏览所有训练图像,检测图像特征(即SURF),并提取描述符。收集所有图像的所有描述符。

  2. 收集的图像描述符中的聚类,并在集合中找到k个“单词”或质心。

  3. 重申所有图像,提取SURF描述符,并将提取的描述符与通过聚类找到的最接近的“单词”进行匹配。

  4. 将每个图像表示为聚类中找到的单词的直方图。

  5. 将这些图像表示(特征向量)提供给分类器和训练......

  6. 现在,我遇到了一些问题。在图像描述符集合中查找“单词”是非常重要的一步。由于聚类的随机性,每次运行程序时都会找到不同的聚类。不幸的结果是,有时我的分类器的准确性会非常好,有时候非常糟糕。我已经将这一点归结为聚类算法有时会发现“好”字,而其他时候会发现“坏”字。

    有谁知道如何通过查找“坏”字来对冲聚类算法?目前我只聚集了几次,并且采用了我的分类器的平均准确度,但必须有更好的方法。

    感谢您花时间阅读本文,并感谢您的帮助!

    编辑:

    我没有使用KMeans进行分类;我正在使用支持向量机进行分类。我正在使用KMeans来查找图像描述符“单词”,然后使用这些单词创建描述每个图像的直方图。这些直方图用作特征向量,馈送到支持向量机进行分类。

3 个答案:

答案 0 :(得分:3)

有许多方法可以使聚类重复:

  • 处理k均值随机性的最基本方法是简单地运行多次并选择最佳的一个(最小化内部簇距离/最大化簇间距离)。
  • 可以使用一些fixed initialization代替您的数据,而不是随机化。启动k-means有许多启发式方法。或者至少通过使用k-means++.
  • 等算法来最小化方差
  • 使用k-means的修改来保证正则化函数的全局最小值,即。 convex k-means
  • 使用不同的聚类方法,即确定性的,即。 Data Nets

答案 1 :(得分:2)

除了提供的建议之外,我会提供两个可能的建议。

K-means优化与聚类点及其质心之间的距离相关的目标。您关心分类准确性。根据计算成本,一个简单的暴力方法是在训练数据的一个子集上引入多个聚类,并在您关心的任务的某些保持开发集上评估每个聚类的性能。然后使用性能最高的变体作为最终模型。我不喜欢使用非随机初始化,因为这只是避免随机性的解决方案,而不是找到目标的真正全局最小值,并且您选择的初始化可能是无用的,只会产生一致的坏分类器。

另一种更难的方法是将k-means步骤视为降维以实现分类,并将其直接合并到分类器中。如果你使用深度神经网络,最接近输入的层基本上是维数减少器,就像你诱导的k均值聚类一样:不同之处在于它们的权重是在分类的网络误差上设置的问题,而不是一些不相关的中间步骤。缺点是这更接近当前的研究问题:训练深网很难。您可以从标准的单隐藏层架构开始(在隐藏层上使用二进制激活,并在输出层上使用交叉熵丢失,输出编码为n个类别之一),并尝试逐步添加层,但据我所知,标准训练算法开始表现得比单个隐藏层差,所以你需要研究初始化的分层训练,或者Geoff Hinton的小组中出现的一些Hessian-Free内容。多伦多。

答案 2 :(得分:1)

这实际上是BofW方法的一个重要问题,你应该分享这个问题。实际上,SIFT数据可能具有k-means集群。然而,由于算法的性质,k-means将总是产生k个簇。使用k-means测试的一个方面是验证结果是否稳定。如果每次得到完全不同的结果,它们并不比随机好得多。

尽管如此,如果您只想获得一些有效的结果,您可以只修改一次字典并选择一个效果良好的字典。

或者你可能会研究更高级的聚类(特别是那些更强大的聚类!)