参考资料:R语言实战【第2版】
因为K均值聚类方法是基于均值,所以它对异常值很敏感。一个更稳健的方法是围绕中心点的划分(PAM)。与其用质心(变量均值向量)表示类,不如用一个最有代表性的观测值来表示(成为中心点)。K均值聚类一般使用欧几里得距离,而PAM可以使用任意的距离来计算。因此,PAM可以容纳混合数据类型,并且不仅限于连续变量。
PAM算法如下:
(1)随机选择K个观测值(每个都成为中心点)
(2)计算观测值到各个中心的距离/相异性
(3)把每个观测值分配到最近的中心点
(4)计算每个中心点到每个观测值的距离中和(总成本)
(5)选择一个该类中不是中心的点,并和中心点互换
(6)重新把每个点分配到距离它最近的中心点
(7)再次计算总成本
(8)如果总成本比步骤(4)计算的总成本少,把新的点作为中心点
(9)重复步骤(5)~(8)直到中心点不在改变。
我们可以使用cluster包中的pam()函数使用基于中心点的划分方法。格式是pam(x,k,metric="euclidean",stand=FALSE),这里的x表示数据矩阵或数据框,k表示聚类的个数,metric表示使用的相似性/相异性的度量,而stand是一个逻辑值,表示是否有变量应该在计算该指标之前被标准化。
# 加载wine数据集
data(wine,package="rattle")
# 查看数据集
head(wine)
# 加载cluster包
library(cluster)
# 设置随机种子,用于复现结果
set.seed(1234)
# PAM聚类
fit.pam<-pam(wine[-1],k=3,stand=TRUE)
# 查看聚类后的中心点
fit.pam$medoids
# 绘制聚类结果
clusplot(fit.pam,main="Bivariate Cluster Plot")
# 验证分类结果
ct.pam<-table(wine$Type,fit.pam$clustering)
ct.pam
# 查看兰德指数
randIndex(ct.pam)
注意,这里得到的中心点是葡萄酒数据集中实际的观测值。通过从13个测定变量上得到的前两个主成分绘制每个观测的坐标来创建二元图。每个类用包含其所有点的最小面积的椭圆表示。
兰德指数用的flexclust包中的兰德指数( Rand index)来量化类型变量和类之间的协议。调整的兰德指数为两种划分提供了一种衡量两个分区之间的协定,即调整后机会的量度。它的变化范围是从–1(不同意)到1 (完全同意)。