聚类的步骤
- 初始化中心点(因为聚类效果和初始中心点相关,容易出现局部最优,所以可以多初始化几次)。
- 根据中心点,计算每个向量到中心点的距离。
- 根据距离,把向量归属于不同的中心点
- 然后对中心点周围的向量,累加取平均形成新的中心点。
- 然后开始新一轮的聚类。
- 从多次聚类中,选择最优的中心点,训练完成。
代码详解
for (int redo = 0; redo < nredo; redo++) { ///切换初始的中心点(避免局部最优),
if (verbose && nredo > 1) {
printf("Outer iteration %d / %d\n", redo, nredo);
}
// initialize remaining centroids with random points from the dataset
centroids.resize (d * k);
std::vector<int> perm (nx);
rand_perm (perm.data(), nx, seed + 1 + redo * 15486557L);
for (int i = n_input_centroids; i < k ; i++) ///n_input_centroids:已有中心点的个数
memcpy (¢roids[i * d], x + perm[i] * d,
d * sizeof (float)); ///初始化中心点
po