聚类是很快的,所以不需要自适应,只需要[1.....N]个类中心,遍历一遍,得到N个评估值,[1.....N]选一个最好的类中心数目即可。
类中心个数的评估:
eva = evalclusters(mat,'kmeans','CalinskiHarabasz',...
'klist',[1:6])
eva = evalclusters(mat,'linkage','CalinskiHarabasz',...
'klist',[1:6])
eva = evalclusters(mat,'gmdistribution','CalinskiHarabasz',...
'klist',[1:6])
mat------你自己的要聚类的数据,(n*d)每行是一个样本。
'kmeans'-----这里是聚类算法,kmeans大家都知道。linkage是针对有层次数据的聚类算法,而gmd是高斯混合聚类。
'CalinskiHarabasz'-------是聚类的评价标准,还有另外 三个选项:
'DaviesBouldin'
'gap'
'silhouette'
那么,假如你已经用这个算法得到了结果,关键问题就变成了怎么挑选最佳聚类中心数目。
klist-----聚类中心的范围。
挑选聚类中心
同样的数据,不同的评价标准,都是kmeans聚类方式。
‘CalinskiHarabasz(CH)'挑选拐点,所以这张图的聚类中心是20.,为了看不同的同学,我给出代码:
plot(eva.CriterionValues)
'DaviesBouldin'最大值点,拐点,所以可以选择20-40之间。
聚类标准含义
聚类代码
[IDX,C,SUMD,D]=kmeans(mat(label==class,:),C_amount);
[IDX,C,SUMD,D]=kmeans(mat,C_amount);
mat就是你要聚类的数据,n*d,返回值:
[IDX, C] = kmeans(X, K) returns the K cluster centroid locations in
the K-by-P matrix C.
[IDX, C, SUMD] = kmeans(X, K) returns the within-cluster sums of
point-to-centroid distances in the K-by-1 vector sumD.
[IDX, C, SUMD, D] = kmeans(X, K) returns distances from each point
to every centroid in the N-by-K matrix D.