R 中的 k 均值聚类:分步示例


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

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

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

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

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

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

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

什么是 K 均值聚类?

K 均值聚类是一种将数据集中的每个观察结果放入K个聚类中的一个技术。

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

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

1. 选择K值。

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

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

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

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

R 中的 K 均值聚类

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

第1步:加载必要的包

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

 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-means 聚类,我们可以使用内置的kmeans()函数,该函数使用以下语法:

kmeans(数据、中心、nstart)

金子:

  • 数据:数据集的名称。
  • 中心:簇的数量,表示为k
  • nstart:初始配置的数量。由于不同的初始启动簇可能会导致不同的结果,因此建议使用几种不同的初始配置。 k-means 算法将找到导致簇内变化最小的初始配置。

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

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

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

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

k-means 聚类中的最佳聚类数

通常,当我们创建此类图时,我们会寻找平方和开始“弯曲”或趋于平坦的“拐点”。这通常是最佳的簇数。

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

2. 聚类数量与间隙统计

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

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

 #calculate gap statistic based on number of clusters
gap_stat <- clusGap(df,
                    FUN = kmeans,
                    nstart = 25,
                    K.max = 10,
                    B = 50)

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

最佳簇数的偏差统计

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

步骤 4:使用最佳K执行 K 均值聚类

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

 #make this example reproducible
set.seed(1)

#perform k-means clustering with k = 4 clusters
km <- kmeans(df, centers = 4, nstart = 25)

#view results
km

K-means clustering with 4 clusters of sizes 16, 13, 13, 8

Cluster means:
      Murder Assault UrbanPop Rape
1 -0.4894375 -0.3826001 0.5758298 -0.26165379
2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
3 0.6950701 1.0394414 0.7226370 1.27693964
4 1.4118898 0.8743346 -0.8145211 0.01927104

Vector clustering:
       Alabama Alaska Arizona Arkansas California Colorado 
             4 3 3 4 3 3 
   Connecticut Delaware Florida Georgia Hawaii Idaho 
             1 1 3 4 1 2 
      Illinois Indiana Iowa Kansas Kentucky Louisiana 
             3 1 2 1 2 4 
         Maine Maryland Massachusetts Michigan Minnesota Mississippi 
             2 3 1 3 2 4 
      Missouri Montana Nebraska Nevada New Hampshire New Jersey 
             3 2 2 3 2 1 
    New Mexico New York North Carolina North Dakota Ohio Oklahoma 
             3 3 4 2 1 1 
        Oregon Pennsylvania Rhode Island South Carolina South Dakota Tennessee 
             1 1 1 4 2 4 
         Texas Utah Vermont Virginia Washington West Virginia 
             3 1 2 1 1 2 
     Wisconsin Wyoming 
             2 1 

Within cluster sum of squares by cluster:
[1] 16.212213 11.952463 19.922437 8.316061
 (between_SS / total_SS = 71.2%)

Available components:

[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss"   
[7] "size" "iter" "ifault"         

从结果我们可以看出:

  • 16 个州被分配到第一个集群
  • 13个州已被分配到第二个集群
  • 13个州已被分配到第三集群
  • 8个州已被分配到第四集群

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

 #plot results of final k-means model
fviz_cluster(km, data = df)

R 中的 K 均值聚类图

我们还可以使用Aggregate()函数来查找每个簇中变量的平均值:

 #find means of each cluster
aggregate(USArrests, by= list (cluster=km$cluster), mean)

cluster Murder Assault UrbanPop Rape
				
1 3.60000 78.53846 52.07692 12.17692
2 10.81538 257.38462 76.00000 33.19231
3 5.65625 138.87500 73.87500 18.78125
4 13.93750 243.62500 53.75000 21.41250

我们将此输出解释如下:

  • 第一组州中每 10 万公民的平均谋杀案数量为3.6 起
  • 第一组国家中每 10 万公民的平均袭击次数为78.5 次
  • 第一组州中居住在城市地区的居民的平均比例为52.1%
  • 第 1 组州每 10 万公民平均发生强奸案12.2

等等。

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

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

#view final data
head(final_data)

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

K-Means 聚类的优点和缺点

K-means 聚类具有以下优点:

  • 这是一种快速算法。
  • 它可以很好地处理大型数据集。

然而,它有以下潜在的缺点:

  • 这需要我们在运行算法之前指定簇的数量。
  • 它对异常值很敏感。

k 均值聚类的两种替代方法是k 均值聚类和层次聚类。


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

添加评论

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