Зачем мне нужно указывать количество кластеров в иерархической кластеризации OpenCV - PullRequest
1 голос
/ 03 апреля 2019

Если мы знаем количество кластеров во входных данных, мы можем использовать алгоритм k-средних.Однако, если мы не знаем количество кластеров, у нас есть варианты использовать алгоритм иерархической кластеризации, который будет автоматически возвращать количество кластеров на основе заданного порога сходства.Существует два варианта иерархической кластеризации: агломерация (снизу вверх) или деление (сверху вниз), ссылка .Я хочу использовать иерархическую кластеризацию OpenCV.

Однако алгоритм OpenCVs hierarchicalClustering принимает центры в качестве параметра и использует количество строк в качестве желаемого числа кластеров в отличие от фактической иерархической кластеризации.Для меня OpenCV hierarchicalClustering такой же, как кластеризация k-средних.Есть ли какая-либо другая функция в OpenCV, которая может возвращать количество кластеров на основе заданного порога подобия?

typedef cv::flann::L2<float> D;
float a[] = {0, 0, 0, 0 };

cvflann::Matrix< D::ResultType> centers(a, 2, 2, 0);

const cvflann::KMeansIndexParams params1(
        2,
       100,
       cvflann::flann_centers_init_t::FLANN_CENTERS_RANDOM,
       .2 
);


int number_of_clusters = cvflann::hierarchicalClustering<D> (features,
                                                             centers,
                                                             params1
                                                             );


Другой параметр, который мы передаем, - cb_index = 0.2.Является ли это порогом для расстояний между кластерами или кластером, связанным как радиусный порог.

1 Ответ

2 голосов
/ 12 апреля 2019

number_of_clusters - это реальное количество кластеров, и оно может быть меньше размера центров.Значение размера центров - это максимальное количество кластеров.

До встречи пример :

    // clustering
    Mat1f centers(clusterNum, descriptorNum);
    ::cvflann::KMeansIndexParams kmean_params;
    unsigned int resultClusters = hierarchicalClustering< L2<float> >(samples, centers, kmean_params);
    if (resultClusters < clusterNum)
    {
        centers = centers.rowRange(Range(0, resultClusters));
    }
    Index flann_index(centers, KDTreeIndexParams());
    printf("resulted clusters number: %u\n", resultClusters);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...