Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VLFeat kmeans C API解释_C++_C_K Means_Vlfeat - Fatal编程技术网

C++ VLFeat kmeans C 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

我正在尝试使用,但我真的很难理解它是如何工作的

注:我在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]);
      }
    }