分层k-means聚类和HCPC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分层k-means聚类和HCPC相关的知识,希望对你有一定的参考价值。

参考技术A The procedure is as follow:

The HCPC (Hierarchical Clustering on Principal Components) approach allows us to combine the three standard methods used in multivariate data analyses (Husson, Josse, and J. 2010):
1.Principal component methods (PCA, CA, MCA, FAMD, MFA),
2.Hierarchical clustering and
3.Partitioning clustering, particularly the k-means method.

FactoMineR软件包中实现的HCPC方法的算法可总结如下:
1.Compute principal component methods:PCA,(M)CA或MFA,具体取决于数据集中变量的类型和数据集的结构。在这一步,您可以通过指定参数ncp来选择要保留在输出中的维数(主要成分),预设值为5。
2.Compute hierarchical clustering:层次聚类是使用Ward准则对选定的主要组件执行的。Ward标准用于层次聚类中,因为它基于像主成分分析这样的多维方差。
3.Choose the number of clusters based on the hierarchical tree:通过切割层次树来执行初始分区。
4.Perform K-means clustering改善从分层聚类获得的初始分区。
使用k-均值合并后获得的最终分区解决方案可能与(通过层次划分)聚类中获得的解决方案略有不同。

使用scipy进行层次聚类和k-means聚类

scipy cluster库简介

scipy.cluster是scipy下的一个做聚类的package, 共包含了两类聚类方法: 
1. 矢量量化(scipy.cluster.vq):支持vector quantization 和 k-means 聚类方法 
2. 层次聚类(scipy.cluster.hierarchy):支持hierarchical clustering 和 agglomerative clustering(凝聚聚类)

聚类方法实现:k-means和hierarchical clustering.

###cluster.py
#导入相应的包
import scipy
import scipy.cluster.hierarchy as sch
from scipy.cluster.vq import vq,kmeans,whiten
import numpy as np
import matplotlib.pylab as plt


#生成待聚类的数据点,这里生成了20个点,每个点4维:
points=scipy.randn(20,4)  

#1. 层次聚类
#生成点与点之间的距离矩阵,这里用的欧氏距离:
disMat = sch.distance.pdist(points,euclidean) 
#进行层次聚类:
Z=sch.linkage(disMat,method=average) 
#将层级聚类结果以树状图表示出来并保存为plot_dendrogram.png
P=sch.dendrogram(Z)
plt.savefig(plot_dendrogram.png)
#根据linkage matrix Z得到聚类结果:
cluster= sch.fcluster(Z, t=1, inconsistent) 

print "Original cluster by hierarchy clustering:\n",cluster

#2. k-means聚类
#将原始数据做归一化处理
data=whiten(points)

#使用kmeans函数进行聚类,输入第一维为数据,第二维为聚类个数k.
#有些时候我们可能不知道最终究竟聚成多少类,一个办法是用层次聚类的结果进行初始化.当然也可以直接输入某个数值. 
#k-means最后输出的结果其实是两维的,第一维是聚类中心,第二维是损失distortion,我们在这里只取第一维,所以最后有个[0]
centroid=kmeans(data,max(cluster))[0]  

#使用vq函数根据聚类中心对所有数据进行分类,vq的输出也是两维的,[0]表示的是所有数据的label
label=vq(data,centroid)[0] 

print "Final clustering by k-means:\n",label

 

 

在Terminal中输入:python cluster.py 
输出: 
Original cluster by hierarchy clustering: 
[4 3 3 1 3 3 2 3 2 3 2 3 3 2 3 1 3 3 2 2] 
Final clustering by k-means: 
[1 2 1 3 1 2 0 2 0 0 0 2 1 0 1 3 2 2 0 0] 
数值是随机标的,不用看,只需要关注同类的是哪些.可以看出层次聚类的结果和k-means还是有区别的.


补充:一些函数的用法

1.linkage(y, method=’single’, metric=’euclidean’) 
共包含3个参数: 
y是距离矩阵,由pdist得到;method是指计算类间距离的方法,比较常用的有3种: 
(1)single:最近邻,把类与类间距离最近的作为类间距 
(2)complete:最远邻,把类与类间距离最远的作为类间距 
(3)average:平均距离,类与类间所有pairs距离的平均

其他的method还有如weighted,centroid等等,具体可以参考: http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html#scipy.cluster.hierarchy.linkage

2.fcluster(Z, t, criterion=’inconsistent’, depth=2, R=None, monocrit=None) 
第一个参数Z是linkage得到的矩阵,记录了层次聚类的层次信息; t是一个聚类的阈值-“The threshold to apply when forming flat clusters”,在实际中,感觉这个阈值的选取还是蛮重要的.另外,scipy提供了多种实施阈值的方法(criterion):

inconsistent : If a cluster node and all its descendants have an inconsistent value less than or equal to t then all its leaf descendants belong to the same flat cluster. When no non-singleton cluster meets this criterion, every node is assigned to its own cluster. (Default)

distance : Forms flat clusters so that the original observations in each flat cluster have no greater a cophenetic distance than t.

……

其他的参数我用的是默认的,具体可以参考: 
http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.fcluster.html#scipy.cluster.hierarchy.fcluster

3.kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True) 
输入obs是数据矩阵,行代表数据数目,列代表特征维度; k_or_guess表示聚类数目;iter表示循环次数,最终返回损失最小的那一次的聚类中心; 
输出有两个,第一个是聚类中心(codebook),第二个是损失distortion,即聚类后各数据点到其聚类中心的距离的加和.

4.vq(obs, code_book, check_finite=True) 
根据聚类中心将所有数据进行分类.obs为数据,code_book则是kmeans产生的聚类中心. 
输出同样有两个:第一个是各个数据属于哪一类的label,第二个和kmeans的第二个输出是一样的,都是distortion

以上是关于分层k-means聚类和HCPC的主要内容,如果未能解决你的问题,请参考以下文章

使用scipy进行层次聚类和k-means聚类

不知道“k”的OpenCV中的分层k-Means

[机器学习]二分k-means算法详解

我正在处理 DTM,我想做 k-means、分层和 k-medoids 聚类。我想先规范化 DTM 吗?

对 TF-IDF 特征向量中的特定特征进行加权,用于 k-means 聚类和余弦相似度

Python图像处理丨基于K-Means聚类的图像区域分割