为什么我需要在OpenCV分层集群中指定集群数量

为什么我需要在OpenCV分层集群中指定集群数量,opencv,c++14,hierarchical-clustering,Opencv,C++14,Hierarchical Clustering,如果我们知道输入数据中的聚类数,我们可以使用k-means算法。然而,如果我们不知道聚类的数量,那么我们可以选择使用分层聚类算法,该算法将根据给定的相似性阈值自动返回聚类的数量。分层聚类有两种选择,即聚集(自下而上)或分裂(自上而下), . 我想使用OpenCV分层聚类 但是,OpenCVsHierarchycalClustering算法将中心作为参数,并使用行数作为所需的聚类数,这与实际的分层聚类不同。对我来说,OpenCVHierarchycalClustering与k-means聚类相同。

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

但是,OpenCVs
HierarchycalClustering
算法将中心作为参数,并使用行数作为所需的聚类数,这与实际的分层聚类不同。对我来说,OpenCV
HierarchycalClustering
与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
                                                             );


typedef cv::flann::L2 D;
浮点a[]={0,0,0,0};
cvflann::矩阵中心(a,2,2,0);
常量cvflann::KMeansIndexParams params1(
2.
100,
cvflann::flann\u centers\u init\u t::flann\u centers\u RANDOM,
2.
);
int number_of_clusters=cvflann::HierarchycalClustering(特征,
中心,
参数1
);

我们传入的另一个参数是
cb_index=0.2
。它是簇之间距离的阈值,还是作为半径阈值的簇边界。

number\u of\u clusters是簇的实际数目,可以小于中心大小。“中心大小”值是群集数的最大值

再见:

//集群
Mat1f中心(clusterNum,descriptorNum);
::cvflann::KMeansIndexParams kmean_params;
unsigned int resultClusters=HierarchycalClustering(样本、中心、kmean_参数);
if(结果集群<集群)
{
centers=centers.rowRange(范围(0,resultClusters));
}
索引法兰索引(中心,KDTreeIndexParams());
printf(“结果群集编号:%u\n”,结果群集);

不是向下投票人,但你到底在寻找什么?我已经为自己更新了问题,我总是得到与中心行数相同的聚类数。
    // 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);