R 中的 k-medoids:分步示例


聚类是一种机器学习技术,尝试在数据集中查找观察组或观察

目标是找到聚类,使得每个聚类内的观察结果彼此非常相似,而不同聚类中的观察结果彼此非常不同。

聚类是无监督学习的一种形式,因为我们只是试图在数据集中找到结构,而不是预测响应变量的值。

当企业可以访问以下信息时,聚类通常用于营销:

  • 家庭收入
  • 房子大小
  • 户主职业
  • 到最近市区的距离

当此信息可用时,聚类可用于识别相似的家庭,并且可能更有可能购买某些产品或对某种类型的广告做出更好的反应。

最常见的聚类形式之一称为k 均值聚类

不幸的是,这种方法可能会受到异常值的影响,这就是为什么经常使用的替代方法是k-medoids 聚类

什么是 K-Medoids 聚类?

K-medoids 聚类是一种将数据集中的每个观测值放入K个聚类中的技术。

最终目标是拥有K 个簇,其中每个簇内的观察结果彼此非常相似,而不同簇中的观察结果彼此非常不同。

在实践中,我们使用以下步骤来进行K-means聚类:

1. 选择K值。

  • 首先,我们需要决定要在数据中识别多少个簇。通常我们只需要测试几个不同的K值并分析结果,看看对于给定问题,哪个簇数似乎最有意义。

2. 将每个观测值随机分配到一个初始簇(从 1 到K)

3. 执行以下过程,直到集群分配停止更改。

  • 对于每个K个簇,计算该簇的重心。这是第 k个簇的观测值的特征的p 个中位数的向量。
  • 将每个观测值分配给具有最近质心的簇。这里,最接近是使用欧几里德距离定义的。

技术说明:

由于 k-medoids 使用中位数而不是均值来计算聚类质心,因此它对于异常值往往比 k-means 更稳健。

实际上,如果数据集中没有极端异常值,k-means 和 k-medoids 将产生类似的结果。

R 中的 K-Medoids 聚类

以下教程提供了如何在 R 中执行 k-medoids 聚类的分步示例。

第1步:加载必要的包

首先,我们将加载两个包,其中包含 R 中 k-medoids 聚类的几个有用函数。

 library (factoextra)
library (cluster)

第 2 步:加载和准备数据

在本例中,我们将使用 R 中内置的USArrests数据集,其中包含 1973 年美国各州每 10 万人因谋杀袭击强奸而被捕的人数,以及每个州居住在城市的人口百分比地区。 、都市流行

以下代码显示了如何执行以下操作:

  • 加载USArrests数据集
  • 删除所有有缺失值的行
  • 将数据集中的每个变量缩放为均值 0 和标准差 1
 #load data
df <-USArrests

#remove rows with missing values
df <- na. omitted (df)

#scale each variable to have a mean of 0 and sd of 1
df <- scale(df)

#view first six rows of dataset
head(df)

               Murder Assault UrbanPop Rape
Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
Arizona 0.07163341 1.4788032 0.9989801 1.042878388
Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
California 0.27826823 1.2628144 1.7589234 2.067820292
Colorado 0.02571456 0.3988593 0.8608085 1.864967207

第 3 步:找到最佳簇数

要在 R 中执行 k-medoid 聚类,我们可以使用pam()函数,它代表“围绕中位数进行分区”并使用以下语法:

pam(数据,k,公制=“欧几里德”,标准= FALSE)

金子:

  • 数据:数据集的名称。
  • k:簇的数量。
  • metric:用于计算距离的度量。默认值为Euclidean ,但您也可以指定manhattan
  • Stand:是否对数据集中的每个变量进行标准化。默认值为 false。

由于我们事先不知道最佳集群数量,因此我们将创建两个不同的图表来帮助我们做出决定:

1. 簇数相对于总数的平方和

首先,我们将使用fviz_nbclust()函数创建簇数与平方和总数的关系图:

 fviz_nbclust(df, pam, method = “ wss ”) 

k 中心点的最优聚类

随着簇数量的增加,平方和中的总和通常总是会增加。因此,当我们创建此类图时,我们正在寻找平方和开始“弯曲”或趋于平坦的“膝盖”。

绘图的曲率点通常对应于最佳簇数。超过这个数字,很可能会发生过度拟合

对于该图,在 k = 4 个簇处似乎存在小扭结或“弯曲”。

2. 聚类数量与间隙统计

确定最佳簇数的另一种方法是使用称为偏差统计量的度量,它将不同 k 值的簇内总变异与未进行聚类的分布的预期值进行比较。

我们可以使用cluster包中的clusGap()函数计算每个簇数量的间隙统计量,并使用fviz_gap_stat()函数绘制簇与间隙统计量的关系图:

 #calculate gap statistic based on number of clusters
gap_stat <- clusGap(df,
                    FUN = pam,
                    K.max = 10, #max clusters to consider
                    B = 50) #total bootstrapped iterations

#plot number of clusters vs. gap statistic
fviz_gap_stat(gap_stat) 

R 中的 K-medoids 最佳簇数

从图中我们可以看到,间隙统计量在 k = 4 个簇时最高,这对应于我们之前使用的肘法。

步骤 4:使用 Optimal K执行 K-Medoids 聚类

最后,我们可以使用k的最佳值 4 对数据集执行 k-medoids 聚类:

 #make this example reproducible
set.seed(1)

#perform k-medoids clustering with k = 4 clusters
kmed <- pam(df, k = 4)

#view results
kmed

              ID Murder Assault UrbanPop Rape
Alabama 1 1.2425641 0.7828393 -0.5209066 -0.003416473
Michigan 22 0.9900104 1.0108275 0.5844655 1.480613993
Oklahoma 36 -0.2727580 -0.2371077 0.1699510 -0.131534211
New Hampshire 29 -1.3059321 -1.3650491 -0.6590781 -1.252564419
Vector clustering:
       Alabama Alaska Arizona Arkansas California 
             1 2 2 1 2 
      Colorado Connecticut Delaware Florida Georgia 
             2 3 3 2 1 
        Hawaii Idaho Illinois Indiana Iowa 
             3 4 2 3 4 
        Kansas Kentucky Louisiana Maine Maryland 
             3 3 1 4 2 
 Massachusetts Michigan Minnesota Mississippi Missouri 
             3 2 4 1 3 
       Montana Nebraska Nevada New Hampshire New Jersey 
             3 3 2 4 3 
    New Mexico New York North Carolina North Dakota Ohio 
             2 2 1 4 3 
      Oklahoma Oregon Pennsylvania Rhode Island South Carolina 
             3 3 3 3 1 
  South Dakota Tennessee Texas Utah Vermont 
             4 1 2 3 4 
      Virginia Washington West Virginia Wisconsin Wyoming 
             3 3 4 4 3 
Objective function:
   build swap 
1.035116 1.027102 

Available components:
 [1] "medoids" "id.med" "clustering" "objective" "isolation" 
 [6] "clusinfo" "silinfo" "diss" "call" "data"          

请注意,所有四个聚类质心都是数据集中的实际观测值。在输出的顶部附近,我们可以看到四个质心具有以下状态:

  • 阿拉巴马州
  • 密歇根州
  • 俄克拉荷马州
  • 新罕布什尔

我们可以使用fivz_cluster()函数在散点图上可视化簇,该散点图在轴上显示前两个主成分:

 #plot results of final k-medoids model
fviz_cluster(kmed, data = df)

在 R 中绘制 k-medoid 簇

我们还可以将每个状态的聚类分配添加到原始数据集中:

 #add cluster assignment to original data
final_data <- cbind(USArrests, cluster = kmed$cluster)

#view final data
head(final_data)

           Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 2
Arizona 8.1 294 80 31.0 2
Arkansas 8.8 190 50 19.5 1
California 9.0 276 91 40.6 2
Colorado 7.9 204 78 38.7 2

您可以在此处找到本示例中使用的完整 R 代码。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注