C++ VLFeat kmeans C API解释
我正在尝试使用,但我真的很难理解它是如何工作的 注:我在C++程序中使用了C API,所以我这里发布的任何代码都是C++。此外,我使用的是Eigean头库,因此这些矩阵数据类型来自于此 从示例和API中不清楚的是:C++ VLFeat kmeans C API解释,c++,c,k-means,vlfeat,C++,C,K Means,Vlfeat,我正在尝试使用,但我真的很难理解它是如何工作的 注:我在C++程序中使用了C API,所以我这里发布的任何代码都是C++。此外,我使用的是Eigean头库,因此这些矩阵数据类型来自于此 从示例和API中不清楚的是: 数据必须采用什么格式?kmeans库函数似乎需要一个一维数组,它可以从矩阵的背景中获取。但是,该矩阵需要是列主矩阵还是行主矩阵?也就是说,函数如何知道区分数据的维度和不同的数据向量 如何实际访问群集中心信息?我运行了一个测试,声明我需要5个集群,但使用上面链接中的示例代码,我只返回1
int numData=1000;
int-dims=10;
//使用浮点数据和L1距离进行聚类
VlKMeans*kmeans=vl_kmeans_new(vl_TYPE_FLOAT,VlDistanceL1);
//使用劳埃德算法
vl_kmeans_set_算法(kmeans,VLKmeansloyd);
//通过随机采样数据初始化群集中心
矩阵数据=构建数据(numData,dims);
vl_kmeans_init_使用_rand_数据(kmeans,data.data(),dims,numData,5)将_集中;
//使用Lloyd算法最多运行100次群集优化迭代
vl_kmeans_set_max_num_迭代(kmeans,100);
vl_kmeans_refine_中心(kmeans和数据,numData);
//获得溶液的能量
能量=vl_kmeans_get_能量(kmeans);
//获取集群中心
中心=(双*)vl_kmeans_get_中心(kmeans);
库特
数据必须采用什么格式
报告说:
所有算法都支持float
或double
数据,并且可以使用l1或l2距离进行聚类
您可以指定在创建kmeans句柄时,例如:
VlKMeans *kmeans = vl_kmeans_new(VL_TYPE_FLOAT, VlDistanceL2);
此矩阵需要是列主矩阵还是行主矩阵
它必须位于,即:数据+维度*i
是第i个中心
如何实际访问群集中心信息
使用vl\u kmeans\u get\u centers
。例如,如果您使用float
-s:
/* no need to cast here since get centers returns a `void *` */
const float *centers = vl_kmeans_get_centers(kmeans);
(请参阅有关演员阵容的信息)
此数组的总大小(字节)为sizeof(float)*dimension*numCenters
。如果要打印出中心,可以执行以下操作:
int i, j;
for (i = 0; i < numCenters; i++) {
printf("center # %d:\n", i);
for (j = 0; j < dimension; j++) {
printf(" coord[%d] = %f\n", j, centers[dimension * i + j]);
}
}
inti,j;
对于(i=0;i
/* no need to cast here since get centers returns a `void *` */
const float *centers = vl_kmeans_get_centers(kmeans);
int i, j;
for (i = 0; i < numCenters; i++) {
printf("center # %d:\n", i);
for (j = 0; j < dimension; j++) {
printf(" coord[%d] = %f\n", j, centers[dimension * i + j]);
}
}