使用Kmean找到元素数量最多的集群?

时间:2013-07-18 16:12:07

标签: c++ performance opencv cluster-analysis k-means

我正在使用kmean函数将8-D向量聚类为一组聚类:

 kmeans(Vectors, clusterCount, labels, TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 100, 2), 10, KMEANS_PP_CENTERS, centers);

对我来说,最成功的群集是包含更多数量的向量的群集。所以我的问题是如何找到人口最多的群集? 标签参数是每个向量所属的指标,我觉得如果我用它来查找频率,它会花费一些时间。 是否有人可以提出一个想法?

传统上,我完成了以下任务:

int max = -1;int index = -1;
vector<int> classes;
classes.resize(clusterCount);
for (int i=0;i<labels.rows;i++)
{
  int idx = labels.at<int>(i,0);
  classes[idx]++;
  if (classes[idx] > max)
  {
    max = classes[idx];
    index = idx;
 }
}

有比这更快的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我正在寻找同样的东西,但是还没有找到任何与之完全不同的东西,但是你可以加速你的代码:

  • 每次都不更新您的最高金额
  • 避免使用中间变量(例如int idx

这是我的代码:

int classes[clusterCount];
memset(classes, 0, sizeof(classes[0]) * clusterCount);
int * labels_ptr = labels.ptr<int>(0);
for (int i = 0; i < labels.rows; ++i)
    classes[*labels_ptr++]++;
for (int i = 0; i < clusterCount; ++i)
    {
    if (classes[i] > max)
        {
        max = count[i];
        index = i;
        }
    }

此代码提供与您相同的结果,并且在我的电脑上(英特尔酷睿i7)比您提供的代码(在1000次运行的不同图像上测试)大约强5倍