opencv - 为什么我需要在 OpenCV 层次聚类中指定聚类数

标签 opencv c++14 hierarchical-clustering

如果我们知道输入数据中的簇数,我们可以使用 k-means 算法。但是,如果我们不知道聚类的数量,那么我们可以选择使用层次聚类算法,该算法将根据给定的相似性阈值自动返回聚类的数量。层次聚类有两种选择,即凝聚(自下而上)或 split (自上而下), link .我想使用 OpenCV 层次聚类。

但是,与实际的层次聚类不同,OpenCV 的hierarchicalClustering 算法将中心作为参数,它使用行数作为所需的聚类数。对我来说,OpenCV hierarchicalClustering 与 k-means 聚类相同。 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。它是集群之间距离的阈值还是作为半径阈值的集群边界。

最佳答案

number_of_clusters 是集群的真实数量,它可以小于中心大小。中心大小值是簇数的最大值。

再见example :

    // 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);

关于opencv - 为什么我需要在 OpenCV 层次聚类中指定聚类数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499949/

相关文章:

c++ - 使用 opencv 通过 Filestorage 保存时出错

c++ - 切换到另一个不同的自定义分配器->传播到成员字段

python - 使用相似度函数对 scikit-learn 进行聚类

android - 在 android studio 上使用 Oboe 时出现未知警告选项 '-Wshadow-field' 错误

python - 将颜色条添加到集群热图

python - 将距离矩阵传递给 seaborn clustermap

python - 如何获得2d的高斯核? (opencv)

opencv - 如何在不使对象角发散的情况下对对象进行细化或骨架化?

opencv - 两个相机系统之间的旋转矩阵

c++ - 检测任意成员的存在