聚类算法--K-Medoids(基于R的应用示例)

时间:2024-02-29 20:57:57

K-Medoids算法描述

 

一个有极大值的对象可能相当程度上扭曲数据的分布,所以k-means算法对于孤立点是敏感的。

 

不采用簇中对象的平均值作为参照点,可以选用簇中位置中心的对象,即medoid。这样划分方法仍然是基于小化所有对象与其参照点之间的相异度之和的原则来执行的。这是k-medoids方法的基础。

 

k-medoids 聚类算法的基本策略是:首先为每个簇随意选择选择一个代表对象;剩余的对象根据其与代表对象的距离分配给近的一个簇。然后反复地用非代表对象来替代代表对象,以改进聚类的质量。

 

聚类结果的质量用一个代价函数来估算,该函数评估了对象与其参照对象之间的平均相异度。为了判定一个非代表对象Orandom是否是当前一个代表对象Oj好的替代,对于每一个非代表对象p,下面的四种情况被考虑:

 

##第一种情况:p当前隶属于代表对象Oj。如果OjOrandom所代替,且pOi近,ij,那么p被重新分配给Oi

##第二种情况:p当前隶属于代表对象Oj。如果Oj被Orandom所代替,且pOrandom近,那么p被重新分配给Orandom

##第三种情况:p当前隶属于Oiij。如果OjOrandom代替,而p仍然离Oi近,那么对象的隶属不发生变化。

##第四种情况:p当前隶属于Oiij。如果OjOrandom代替,且pOrandom近,那么p被重新 分配给 Orandom

 

在R中,K-medoids的实现是由PAMPartitioning around medoids)聚类实现的,具体过程如下:

 

##第一步,指定聚类数目K和待聚类数据集;

 

##第二步,确定K个初始类质心。采用经验法或随机选择法确定初始类质心;

 

##第三步,根据最近原则进行聚类。依次计算每个观测点到K个类质心的距离,并按照距K个类质心距离最近的原则,将所有观测分派到最近的类中,形成K个类;

 

##第四步,重新确定K个类质心。其中包含:

1.分别计算K个类的质心,即依次计算各类中所有观测点在各个变量上的均值,并以均值点作为新的类质心,为ukk=1,2,...,K)。

2.对于第k类,对每个非质心观测点xik:计算类内其他观测点与xik的距离之和,也称总代价(total cost)。找到最小最代价,若最小总代价小于uk的总代价,则第k类的新质心调整为最小总代价对应的xik。否则,uk作为类质心具有合理性,保持不变。这一步又称为swap步。

 

##第五步,重复第三、四步,直到达到收敛条件或最大迭代次数。

 

基于RPAM聚类应用示例

 

RPAM函数

RPAM聚类函数是cluster包中的pam函数,其基本命令为:

pam(x=矩阵或数据框, k=聚类数目Kmedoids=初始类质心向量,do.swap=TRUE/FALSEstand=TRUE/FALSE)

 

其中:
## 参数x可以是存储聚类变量的数据框或距离矩阵;

## 参数k指定聚类数目;

## 参数medoids用于指定K个观测点作为初始类质心,是包含K各元素的向量;如c2,6)表示以第2和第6个观测点作为K=2时的初始类质心。该参数可以省略,算法将随机化初始类质心,该过程称为build过程。

## 参数do.swapTRUEFALSE,表示是否进行swap步。因swap步会占用更多的计算资源,可视情况设置为FALSE

## 参数standTRUEFALSE,表示是否对聚类变量进行标准化处理一消除数量级和量纲影响。默认为FALSE,当x是距离矩阵时该参数无效。

 

pam函数的返回结果为包括若干成分的列表,主要成分包括:


## clustersing:存储各观测所属的类别。

## clusinfo:存储个类包含的观测数、类内的最大绝对距离、平均绝对距离和标准差。

## silinfo:存储各观测所属的类、其邻居类以及轮宽(silhouette)值。

 

观测xi的轮宽定义为:


设聚类数目K=3,观测xi属于第1类。是观测Xi对第1类的总代价,是观测对第2,3类总代价的最小值。该值越接近于1,表明xi所属的类越合理,越接近于-1,表明xi越可能属于错误的类

 

PAM聚类示例

首先将数据聚成2类,最终两个类质心为第18和第45号观测,两变量分别取值为(3.25-3.51)和(0.54,0.82)。

 

##  PAM聚类

set.seed(12345)

x<-matrix(rnorm(n=100,mean=0,sd=1),ncol=2,byrow=TRUE)

x[1:25,1]<-x[1:25,1]+3            

x[1:25,2]<-x[1:25,2]-4

library("cluster")

(PClu<-pam(x=x,k=2,do.swap=TRUE,stand=FALSE))

 

PAM聚类部分结果如下:

 

 

可利用plot函数将之可视化,命令如下:

plot(x=PClu,data=x)

 


如上所示,两类边界接壤但没有相互交叉,聚类效果是比较理想的。

 

如上所示,可以看到各个观测的轮宽以及各类的平均轮宽,轮宽值较小的观测位于两类边界附近的观测。