进行k-均值聚类
1. 首先初始化一个聚类对象:
KMeansClustererLabel<String> clusterer
=
new
KMeansClustererLabel<String>(
FEATURE_EXTRACTOR
,
numClusters,
maxIterations,
false
,0.0)
2.调用对象的聚类方法:
public Set<Set<E>> cluster(Set<? extends E> elementSet,
Random random,
Reporter reporter)
在这个聚类方法中:
(1). 首先通过toVectors方法
MapSymbolTable symTab
= toVectors(elements,featuress,valss,eltSqLengths);
//初始化 featuress,valss eltSqLengths
(2). 然后通过
kmeansPlusPlusInit初始化
closestCenters,
centroidss,
kmeansPlusPlusInit(featuress,valss,eltSqLengths,
closestCenters,
centroidss,
random);
(3). 最后调用kMeansEpochs进行迭代
kMeansEpochs(elements,eltSqLengths,
centroidss,
featuress,valss,
sqDistToCenters,closestCenters,
mMaxEpochs,reporter);
在kMeansEpochs方法中
1).在每次迭代中将
changedClusters分成两部分,通过
numChangedClusters开划分,前半部分是变化的类,后半部分是不在变化的类
2).在每次迭代中,遍历所有的样本,找出这个样本距离最近的类心,距这个类心的距离,确定这个样本所属的类。
3).初始化
scoreMapList,根据样本所属类
scoreMapList.get(closestCenters[i]).set(elements[i],
sqDistToCenters[i] == 0.0 ? -Double. MIN_VALUE : -sqDistToCenters [i]
);
4).给类内的成员进行排序并对类进行打分
Set<E> cluster
=
new
LinkedHashSet<E>(clusterDistances.keysOrderedByValueList());
//得到该团中所有的key,其结果是按value的大小进行排序
clusterScores.set(cluster,
//不同的团的样本放在不同的团中
totalScores[k] == 0.0
//如何这个团的分为 0.0,则将value设为负无穷大,否则为团的总分/团的大小
? -Double.
MIN_VALUE
: totalScores[k]/cluster.size());
5).按照各类的分值对最终结果中的类进行排序
Set<Set<E>> result = new LinkedHashSet<Set<E>>(clusterScores.keysOrderedByValueList()); //得到全部的团key,并按团的value(总分)进行排序