赞
踩
KMeans++ 的初始化方法:
1、随机选一个样本作为第一个簇中心。
2、计算每个样本到最近簇中心的距离。
3、以距离为概率随机选择下一个簇中心。
4、重复步骤2和3,直到找到K个簇中心。
vlfeat \ kmeans.c \ _vl_kmeans_init_centers_plus_plus_ 中的代码片段如下:
- x = vl_rand_uindex (rand, numData) ;
- c = 0 ;
- while (1) {
- TYPE energy = 0 ;
- TYPE acc = 0 ;
- TYPE thresh = (TYPE) vl_rand_real1 (rand) ;
-
- //把随机选的样本作为簇中心。
- memcpy ((TYPE*)self->centers + c * dimension,
- data + x * dimension,
- sizeof(TYPE) * dimension) ;
-
- c ++ ;
- if (c == numCenters) break ;
-
- //计算所有样本到当前簇中心的距离。
- VL_XCAT(vl_eval_vector_comparison_on_all_pairs_, SFX)
- (distances,
- dimension,
- (TYPE*)self->centers + (c - 1) * dimension, 1,
- data, numData,
- distFn) ;
-
- //计算所有样本到最近簇中心的距离,并求和。
- for (x = 0 ; x < numData ; ++x) {
- minDistances[x] = VL_MIN(minDistances[x], distances[x]) ;
- energy += minDistances[x] ;
- }
-
- //随机数落在距离和中的哪一段,就以对应样本为下一个簇中心。
- for (x = 0 ; x < numData - 1 ; ++x) {
- acc += minDistances[x] ;
- if (acc >= thresh * energy) break ;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。