聚类实践R

本文介绍了如何使用R语言进行聚类分析,包括K均值聚类和系统聚类。通过全国31个省级行政区城镇居民家庭人均消费性支出数据,应用kmeans()函数将数据分为4类,并分析了各类的特征。聚类结果展示了不同地区的消费性支出差异,并讨论了不同聚类方法的适用场景和算法原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚类分析一般指把多元观测数据的观测按照某种临近或相似性标准分成若干组,每
一组内的观测是比较相近或相似的。这样的聚类又称为 Q 型聚类,即对样品的聚
类。
另一种聚类是把多个变量按照其在所有观测上的取值分成若干个变量组,每一组内
的变量比较相近或相似,这样的聚类分析称为变量聚类或 R 型聚类。
从数学上看两种聚类没有本质差别(只要把观测矩阵转置就得到另一种聚类问题)。
常用的聚类方法包括:
• 系统(谱系)聚类法 (hierarchical clustering),从每类只有单个元素开始,每
次合并两类;
• k 均值聚类法 (k-means clustering),需要设定类的个数,然后迭代地调整元
素的类属使同类的元素接近而异类元素分离。

系统聚类葡萄酒实例
> getwd()
[1] "C:/Users/gg葱/Documents"
> setwd("D:\\Documents\\Rcode\\KNN")
> 

> winescore<-read.csv("wineScore.csv")
> winescore
     x1   x2   x3   x4   x5   x6
1  4.65 4.22 5.01 4.50 4.15 4.12
2  6.32 6.11 6.21 6.85 6.52 6.33
3  4.87 4.60 4.95 4.15 4.02 4.11
4  4.88 4.68 4.43 4.12 4.03 4.14
5  6.73 6.65 6.72 6.13 6.51 6.36
6  7.45 7.56 7.60 7.80 7.20 7.18
7  8.10 8.23 8.01 7.95 8.31 8.26
8  8.42 8.54 8.12 7.88 8.26 7.98
9  6.45 6.81 6.52 6.31 6.27 6.06
10 7.50 7.32 7.42 7.52 7.10 6.95


> knitr::kable(winescore)


|   x1|   x2|   x3|   x4|   x5|   x6|
|----:|----:|----:|----:|----:|----:|
| 4.65| 4.22| 5.01| 4.50| 4.15| 4.12|
| 6.32| 6.11| 6.21| 6.85| 6.52| 6.33|
| 4.87| 4.60| 4.95| 4.15| 4.02| 4.11|
| 4.88| 4.68| 4.43| 4.12| 4.03| 4.14|
| 6.73| 6.65| 6.72| 6.13| 6.51| 6.36|
| 7.45| 7.56| 7.60| 7.80| 7.20| 7.18|
| 8.10| 8.23| 8.01| 7.95| 8.31| 8.26|
| 8.42| 8.54| 8.12| 7.88| 8.26| 7.98|
| 6.45| 6.81| 6.52| 6.31| 6.27| 6.06|
| 7.50| 7.32| 7.42| 7.52| 7.10| 6.95|
> d <- winescore;summary(d)
       x1              x2       
 Min.   :4.650   Min.   :4.220  
 1st Qu.:5.240   1st Qu.:5.037  
 Median :6.590   Median :6.730  
 Mean   :6.537   Mean   :6.472  
 3rd Qu.:7.487   3rd Qu.:7.500  
 Max.   :8.420   Max.   :8.540  
       x3              x4       
 Min.   :4.430   Min.   :4.120  
 1st Qu.:5.310   1st Qu.:4.907  
 Median :6.620   Median :6.580  
 Mean   :6.499   Mean   :6.321  
 3rd Qu.:7.555   3rd Qu.:7.730  
 Max.   :8.120   Max.   :7.950  
       x5              x6       
 Min.   :4.020   Min.   :4.110  
 1st Qu.:4.680   1st Qu.:4.620  
 Median :6.515   Median :6.345  
 Mean   :6.237   Mean   :6.149  
 3rd Qu.:7.175   3rd Qu.:7.122  
 Max.   :8.310   Max.   :8.260 
样本点间的距离

首先用欧式距离计算距离矩阵

d.mat <- dist(d, method='euclidean',
diag=TRUE, upper=F)
knitr::kable(as.data.frame(round(as.matrix(d.mat), 2)))

|    1|    2|    3|    4|    5|    6|    7|    8|    9|   10|
|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|
| 0.00| 4.88| 0.58| 0.87| 5.14| 7.43| 9.13| 9.26| 4.87| 7.03|
| 4.88| 0.00| 4.94| 5.07| 1.11| 2.72| 4.36| 4.56| 1.01| 2.34|
| 0.58| 4.94| 0.00| 0.53| 5.10| 7.44| 9.11| 9.22| 4.83| 7.02|
| 0.87| 5.07| 0.53| 0.00| 5.26| 7.60| 9.26| 9.37| 4.99| 7.19|
| 5.14| 1.11| 5.10| 5.26| 0.00| 2.46| 4.02| 4.14| 0.57| 2.04|
| 7.43| 2.72| 7.44| 7.60| 2.46| 0.00| 1.86| 1.99| 2.66| 0.48|
| 9.13| 4.36| 9.11| 9.26| 4.02| 1.86| 0.00| 0.54| 4.32| 2.21|
| 9.26| 4.56| 9.22| 9.37| 4.14| 1.99| 0.54| 0.00| 4.42| 2.32|
| 4.87| 1.01| 4.83| 4.99| 0.57| 2.66| 4.32| 4.42| 0.00| 2.26|
| 7.03| 2.34| 7.02| 7.19| 2.04| 0.48| 2.21| 2.32| 2.26| 0.00|
dist(data, method=) 函数计算观测间的距离。在 dist() 函数中,diag
选项决定显示距离阵时是否显示对角线元素,upper 决定显示距离阵时是否显示上
三角元素,method 是距离种类:
• euclidean 欧式距离;
• manhattan 曼哈顿距离;
• maximum 最大(上确界)距离;
• minkowski 闵可夫斯基距离;
• canberra 兰氏距离。

本例的 6 个评分取值范围相近,所以不需要标准化。如果变量取值范围差别很大,在计算距离前一般应该把每列标准化 (scale() 函数)

用最短距离法聚类
> res1 <- hclust(d.mat, method='single'); res1

Call:
hclust(d = d.mat, method = "single")

Cluster method   : single 
Distance         : euclidean 
Number of objects: 10
hclust() 函数中选项 method 选择系统聚类的类间距离,包括:
• single 最短距离法,
• complete 最大距离法
• average 类平均法
• median 中间距离法
• centrold 重心法
• ward Ward 法

对 hclust() 的输出结果用 plot() 画聚类树状图:

plot(res1)

![在这里插入图片描述](https://img-blog.csdnimg.cn/6fa72ea4d807492dbc6404f7484e75c1.jpeg
注意:观测的左右关系不代表距离,两类相连时纵轴的高度才代表两类之间的距离,距离越大,越不应该合并到一起。从图上看分为两类比较合适。
• 第一类: 1, 3, 4;
• 第二类: 2, 5, 6, 7, 8, 9, 10。
对 hclust() 的输出结果用 cutree(tree, k=) 得到每个观测的分类号,输出类
号组成的向量。注意聚类方法的结果是一些分类,具体的类编号并没有意义。

cut1 <- cutree(res1, k=2); cut1

 [1] 1 2 1 1 2 2 2 2 2 2

结果 cut1 是分为两类后每个观测的类编号。
用并列盒形图验证分类:

boxplot(t(as.matrix(winescore)))

在这里插入图片描述