首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VLFeat API API解释

VLFeat API API解释
EN

Stack Overflow用户
提问于 2015-02-10 17:39:14
回答 1查看 659关注 0票数 1

我正在尝试使用用C语言实现VLFeat的kmeans,但是我很难理解它是如何工作的。

注意:我在C++程序中使用了C++,所以我在这里发布的任何代码都是C++。另外,我使用的是特征头库,这就是那些矩阵数据类型的来源。

从示例和API中不清楚的是:

  1. 数据必须采用什么格式?kmeans库函数似乎需要一个一维数组,该数组可以从矩阵的后盾中提取。但是,此矩阵是否需要是列主还是行主?也就是说,函数如何区分数据的维数和不同的数据向量?
  2. 我如何实际访问集群中心的信息?我运行了一个测试,声明我需要5个集群,但是使用上面链接中的示例代码,我只返回1。

代码:

代码语言:javascript
复制
int numData = 1000;
int dims = 10;
// Use float data and the L1 distance for clustering
VlKMeans * kmeans = vl_kmeans_new (VL_TYPE_FLOAT,  VlDistanceL1) ;
// Use Lloyd algorithm
vl_kmeans_set_algorithm (kmeans, VlKMeansLloyd) ;
// Initialize the cluster centers by randomly sampling the data
Matrix<float, 1000,10, RowMajor> data = buildData(numData, dims);
vl_kmeans_init_centers_with_rand_data (kmeans, data.data(), dims, numData, 5);
// Run at most 100 iterations of cluster refinement using Lloyd algorithm
vl_kmeans_set_max_num_iterations (kmeans, 100) ;
vl_kmeans_refine_centers (kmeans, &data, numData) ;
// Obtain the energy of the solution
energy = vl_kmeans_get_energy(kmeans) ;
// Obtain the cluster centers
centers = (double*)vl_kmeans_get_centers(kmeans);
cout << *centers << endl;

示例输出: centers = 0.0376879 (一个标量)

我怎么能得到所有的中心?我尝试使用数组来存储中心,但它不接受这种类型。

我还尝试了以下方法,假设我只是访问了中心的信息不对:

代码语言:javascript
复制
cout << centers[0]<< endl;
cout << centers[1]<< endl;
cout << centers[2]<< endl;
cout << centers[3]<< endl;
cout << centers[4]<< endl;
cout << centers[5]<< endl;
cout << centers[6]<< endl;
cout << centers[7]<< endl;
cout << centers[8]<< endl;

但是对于索引0-4 (给定5个集群中心),我应该只有零-零值。实际上,我预计会为更高的指数抛出异常。如果这是正确的方法,能否有人向我解释这些其他值(指数5-8)来自什么?

我确信还有其他令人困惑的部分,但我甚至还没有解决这些问题,因为我一直被困在这两个非常重要的部分上(我的意思是,如果不能正确地开始集群,那么这是什么意思)。

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-11 10:14:37

数据必须采用什么格式?

手册说:

所有算法都支持floatdouble数据,并且可以使用l1或l2距离进行聚类。

指定在创建kmeans句柄时,例如:

代码语言:javascript
复制
VlKMeans *kmeans = vl_kmeans_new(VL_TYPE_FLOAT, VlDistanceL2);

这个矩阵需要是列大写还是行大写?

它一定在行大调,即:data + dimension * i是第一个中心.

我如何实际访问集群中心的信息?

vl_kmeans_get_centers。例如,如果您使用float-s:

代码语言:javascript
复制
/* no need to cast here since get centers returns a `void *` */
const float *centers = vl_kmeans_get_centers(kmeans);

(请参阅有关演员的https://stackoverflow.com/a/605858/1688185 )

该数组的总大小(以字节为单位)为sizeof(float) * dimension * numCenters。如果您想打印出中心,您可以:

代码语言:javascript
复制
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]);
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28438212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档