3

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

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

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

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

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

  5. 将这些图像表示(特征向量)输入分类器并训练...

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

有谁知道我可以如何避免发现“坏”词的聚类算法?目前我只是聚类了几次并取了我的分类器的平均准确率,但必须有更好的方法。

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

编辑:

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

4

3 回答 3

5

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

  • 处理 k-means 随机性的最基本方法是简单地运行它多次并选择最好的一个(最小化内部簇距离/最大化簇间距离的那个)。
  • 可以为您的数据使用一些固定的初始化而不是随机化。启动 k-means 有许多启发式方法。或者至少通过使用k-means++ 之类的算法来最小化方差。
  • 使用 k-means 的修改来保证正则化函数的全局最小值,即。凸 k 均值
  • 使用不同的聚类方法,这是确定性的,即。数据网
于 2013-09-07T17:00:41.280 回答
2

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

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

另一种更难的方法是将 k-means 步骤视为降维以实现分类,并将其直接合并到分类器中。如果您使用深度神经网络,则最接近输入的层本质上是降维器,其方式与您诱导的 k 均值聚类相同:不同之处在于它们的权重是根据网络在分类上的误差设置的问题,而不是一些不相关的中间步骤。缺点是这更接近当前的研究问题:训练深度网络很困难。您可以从标准的单隐藏层架构开始(在隐藏层使用二进制激活,并在输出层使用交叉熵损失,输出编码为 n 个类别之一),并尝试逐步添加层,但就我而言

于 2013-09-09T15:49:17.723 回答
1

这实际上是 BofW 方法的一个重要问题,您应该在显着位置分享这一点。SIFT 数据实际上可能根本没有k-means 聚类。然而,由于算法的性质,k-means 总是会产生 k 个簇。使用 k-means 进行测试的一件事是验证结果是否稳定。如果每次都得到完全不同的结果,它们并不比随机好多少。

不过,如果您只是想获得一些工作结果,您可以只修复一次字典并选择一个工作良好的字典。

或者您可能会研究更高级的聚类(特别是一种更强大的噪声!)

于 2013-09-07T20:58:39.943 回答