Я использую функцию 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;
}
}
Есть ли решение быстрее, чем это?
Я ищу то же самое, но не нашел ничего (пока), что существенно отличается, однако вы можете ускорить свой код:
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;
}
}
этот код дает те же результаты, что и у вас, и на моем компьютере (Intel Core i7) идет примерно 5 раз быстрее, чем код, который вы предоставили (проверено на разных изображениях на 1000 прогонов).
Других решений пока нет …