聚类分析原理及R语言实现过程

标签: R语言  大数据  聚类分析  kmeans  机器学习

聚类分析定义与作用:

是把分类对象按照一定规则分成若干类,这些类不是事先设定的,而是根据数据的特征确定的。在同一类中这些对象在某种意义上趋向于彼此相似,而在不同类中对象趋向于彼此不相似。在经济、管理、地质勘探、天气预报、生物分类、考古学、医学、心理学以及制定国家标准和区域标准等许多方面应用十分广泛,是国内外较为流行的多变量统计分析方法之一。

聚类分析的类型:

是实际问题中,如根据各省主要的经济指标,将全国各省区分成为几个区域等。这个主要的经济指标是我们用来分类的依据。称为指标(变量),用X1、X2 … Xp表示,p是变量的个数。在聚类分析中,基本的思想是认为所研究的样品或者多个观测指标(变量)之间存在着程度不同的相似性(亲疏关系)。根据这些相识程度,把样品划分成一个由小到大的分类系统,最后画出一张聚类图表示样品之间的亲疏关系。根据分类对象的不同,可将聚类分析分为两类,一是对分类处理,叫Q型;另一种是对变量处理,叫R型。

聚类统计量:

聚类分析的基本原则是将有较大相似性的对象归为同一类,可进行聚类的统计量有距离和相似系数。

{{{

聚类分析的方法:

系统聚类法、快速聚类法、模糊聚类法。

系统聚类

常用的有如下六种:

1、最短距离法;2、最长距离法;3、类平均法;4、重心法;5、中间距离法;6、离差平方和法

快速聚类

常见的有K-means聚类。

R语言实现系统聚类和K-means聚类过程详解

系统聚类R语言过程

第一步:计算距离

在R语言进行系统聚类时,先计算样本之间的距离,计算之前先对样品进行标准变换。用scale()函数。R语言各种距离的计算用dist()函数来实现。具体用法为:
dist(x , method = " euclidean " , diag = FALSE, upper = FALSE, p = 2)
x:为数据矩阵或者数据框。
method:为计算方法,包括"euclidean"欧式距离,"maximum"切比雪夫距离,"manhattan"绝对值距离,"Canberra"兰氏距离,"minkowski" 闵可夫斯基距离,"binary"定型变量的距离。
diag是逻辑变量,当diag = TRUE时,给出对角线上的距离。
upper是逻辑变量,当upper = TRUE时,给出上三角矩阵的值(缺省值仅给出下三角矩阵的值)。
p:为minkowski距离的幂次

第二步:系统聚类

在R语言中用hclust()函数进行系统聚类。hclust具体用法为:
hclust(dist , method)
dist:为第一步计算出来的距离
method:为系统聚类方法,有"single"最短距离法,"complete”最长距离法,"median"中间距离法,"mcquitty" Mcquitty相似法,"average"类平均法,"centroid"重心法,"ward"离差平方和法

第三步:画出聚类图

R语言中用plot()函数画出聚类图,具体用法为:
plot(x, hang = 0.1, axes = TRUE , main = "Cluster Dendrogram", sub = NULL, xlab = NULL, ylab = "Height",...)
x:第二步中hclust得出的对象
hang:表明谱系图中各类所在的位置,当hang取负值时,谱系图中的类从底部画起
main:给聚类图添加标题
sub:给聚类图添加子标题
xlab:为x轴添加说明
ylab:为y轴添加说明

第四步:画出分类矩形框

最后一步用rect.hclust(x, k = n)函数画出分类矩形框。其中x为第二步hclust得出的对象,K为要分的类数。

例1

为研究我国31个省、市、自治区2007年的城镇居民生活消费的规律,根据调查资料作区域消费类型划分。原始数据如下:

city 食品 衣着 设备 医疗 交通 教育 居住 杂项
北京 4934.05 1512.88 981.13 1294.07 2328.51 2383.96 1246.19 649.66
天津 4249.31 1024.15 760.56 1163.98 1309.94 1639.83 1417.45 463.64
河北 2789.85 975.94 546.75 833.51 1010.51 895.06 917.19 266.16
山西 2600.37 1064.61 477.74 640.22 1027.99 1054.05 991.77 245.07
内蒙古 2824.89 1396.86 561.71 719.13 1123.82 1245.09 941.79 468.17
辽宁 3560.21 1017.65 439.28 879.08 1033.36 1052.94 1047.04 400.16
吉林 2842.68 1127.09 407.35 854.8 873.88 997.75 1062.46 394.29
黑龙江 2633.18 1021.45 355.67 729.55 746.03 938.21 784.51 310.67
上海 6125.45 1330.05 959.49 857.11 3153.72 2653.67 1412.1 763.8
江苏 3928.71 990.03 707.31 689.37 1303.02 1699.26 1020.09 377.37
浙江 4892.58 1406.2 666.02 859.06 2473.4 2158.32 1168.08 467.52
安徽 3384.38 906.47 465.68 554.44 891.38 1169.99 850.24 309.3
福建 4296.22 940.72 645.4 502.41 1606.9 1426.34 1261.18 375.98
江西 3192.61 915.09 587.4 385.91 732.97 973.38 728.76 294.6
山东 3180.64 1238.34 661.03 708.58 1333.63 1191.18 1027.58 325.64
河南 2707.44 1053.13 549.14 626.55 858.33 936.55 795.39 300.19
湖北 3455.98 1046.62 550.16 525.32 903.02 1120.29 856.97 242.82
湖南 3243.88 1017.59 603.18 668.53 986.89 1285.24 869.59 315.82
广东 5056.68 814.57 853.18 752.52 2966.08 1994.86 1444.91 454.09
广西 3398.09 656.69 491.03 542.07 932.87 1050.04 803.04 277.43
海南 3546.67 452.85 519.99 503.78 1401.89 837.83 819.02 210.85
重庆 3674.28 1171.15 706.77 749.51 1118.79 1237.35 968.45 264.01
四川 3580.14 949.74 562.02 511.78 1074.91 1031.81 690.27 291.32
贵州 3122.46 910.3 463.56 354.52 895.04 1035.96 718.65 258.21
云南 3562.33 859.65 280.62 631.7 1034.71 705.51 673.07 174.23
西藏 3836.51 880.1 271.29 272.81 866.33 441.02 628.35 335.66
陕西 3063.69 910.29 513.08 678.38 866.76 1230.74 831.27 332.84
甘肃 2824.42 939.89 505.16 564.25 861.47 1058.66 768.28 353.65
青海 2803.45 898.54 484.71 613.24 785.27 953.87 641.93 331.38
宁夏 2760.74 994.47 480.84 645.98 859.04 863.36 910.68 302.17
新疆 2760.69 1183.69 475.23 598.78 890.3 896.79 736.99 331.8

数据来源—www.stats.gov.cn(中华人民共和国国家统计局)

接着采用欧式距离,分别用最短距离法、最长距离法、类平均法、中间距离法、重心法和ward法得出系统聚类图。

city_data <- read.table("clipboard" , header = T) #导入数据
head(city_data) #预览数据
#将数据框行名为城市名
rownames(city_data) <- city_data$城#去除第一行非数值的城市行
city_data <- city_data[ , -1]
head(city_data) #预览数据
#标准化数据并计算欧式距离
city_dist <- dist(scale(city_data) , method = "euclidean")
city_clust_single <- hclust(city_dist , method = "single") #最短距离法
city_clust_complete <- hclust(city_dist , method = "complete") #最长距离法
city_clust_median <- hclust(city_dist , method = "median") #中间值距离法
city_clust_average <- hclust(city_dist , method = "average") #类平均法
city_clust_centroid <- hclust(city_dist , method = "centroid") #重心法
city_clust_ward <- hclust(city_dist , method = "ward") #ward法
#画出聚类图
plot(city_clust_single , hang=-1 , main = "最短距离法" , sub = NULL, xlab = "城市") ; 
#画出分为5类的矩形框下同
rect.hclust(city_clust_single , k = 4)

最短距离法

plot(city_clust_complete , hang=-1 , main = "最长距离法" , xlab = "城市")
rect.hclust(city_clust_complete , k = 4)

最长距离法

plot(city_clust_median , hang=-1 , main = "中间值距离法" , xlab = "城市")
rect.hclust(city_clust_median , k = 4)

中间值距离法

plot(city_clust_average , hang=-1 , main = "类平均法" , xlab = "城市")
rect.hclust(city_clust_average , k = 4)

类平均法

plot(city_clust_centroid , hang=-1 , main = "重心法" , xlab = "城市")
rect.hclust(city_clust_centroid , k = 4)

重心法

plot(city_clust_ward , hang=-1 , main = "ward法" , xlab = "城市")
rect.hclust(city_clust_ward , k = 4)

ward法

可以看出不同距离方法的分类结果有所差异,但大体的结果是一致的, 北京、上海、浙江、天津、广东消费水平和其他省市自治区有较明显的区别,符合实际情况。

Kmeans聚类R语言教程

步骤:

第一步:将所有样品分成K个初始类。
第二步:通过欧式距离将某个样品划入离中心最近的类中,并对获得样品和失去样品的类重新计算中心坐标。
第三步:重复步骤2,直到所有的样品都不能再分类为止。

在R语言中用kmeans()函数进行kmeans聚类。具体用法为:
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong","Lloyd","Forgy","MacQueen"))

x: 数据构成的矩阵或数据框
centers: 聚类的个数或者是初始类的中心
iter.max: 最大迭代次数(缺省值为10)
nstart: 机集合的个数(当centers为聚类的个数时)
algorithm: 动态聚类的算法(缺省值为Hartigan-Wong方法)

例2

针对例1的数据我们进行kmeans聚类。

#kmeans聚类
km <- kmeans(scale(city_data) , nstart = 20)
km
K-means clustering with 4 clusters of sizes 13, 11, 2, 5

Cluster means:
        食品        衣着       设备       医疗       交通       教育        居住       杂项
1 -0.6420231  0.33063420 -0.2651010  0.2064156 -0.4035376 -0.3412539 -0.09696128 -0.1971042
2 -0.2072279 -0.76608064 -0.5668726 -0.8485955 -0.4598671 -0.5855385 -0.83754016 -0.5908851
3  2.4083940  1.88214591  2.4277382  1.9097941  2.3878327  2.6234721  1.70322090  2.9463725
4  1.1618040  0.07287011  0.9652871  0.5663117  1.1057723  1.1260559  1.41339930  0.6338690

Clustering vector:
  北京   天津   河北   山西 内蒙古   辽宁   吉林 黑龙江   上海   江苏   浙江   安徽   福建   江西   山东   河南   湖北   湖南 
     3      4      1      1      1      1      1      1      3      4      4      2      4      2      1      1      2      1 
  广东   广西   海南   重庆   四川   贵州   云南   西藏   陕西   甘肃   青海   宁夏   新疆 
     4      2      2      1      2      2      2      2      1      2      2      1      1 

Within cluster sum of squares by cluster:
[1] 20.53238 20.03754  5.26181 22.03438
 (between_SS / total_SS =  71.7 %)

Available components:

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

图中的分类结果显示和系统聚类的结果有一定的差距,组间的距离平方和占了整体距离平方和的71.7 % ,说明数据用kmengs分4类不是很理想,发现k=4并不符合实际情况。这就引出了kmeans的一个注意事项。

kmeans的一个注意事项

因为kmeans每次都是随机的把样品分为K个分类,然后计算距离,然后重新分类,所以每次的运行结果不太一样。对类别及k的数值选择不同,分类结果的好坏也不尽相同。选择一个正确的聚类数目对于划分数据是很重要的。
R语言中使用Gap统计值来确定k的个数,他是通过对数据进行bootstrap抽样来比较内差异性。这里使用cluster软件包里面的clusGap函数计算。
本例如下:

#导入程序包
require(cluster)
#计算gap值
city_best <- clusGap(city_data , FUNcluster = pam , K.max = 10)
#提取计算后的Gap结果并转换成数据框
city_gapDF <- as.data.frame(city_best$Tab)
#查看结果
city_gapDF
#导入ggplot2软件包可视化结果
require(ggplot2)
ggplot(city_gapDF , aes(x = 1:nrow(city_gapDF)))+
geom_line(aes(y = gap) , color = "red") + 
geom_point(aes(y = gap) , color = "red") +
geom_errorbar(aes(ymin = gap-SE.sim , ymax = gap + SE.sim) , color = "red") +
labs(x = "分类数" , y = "Gap")

Gap结果

红色曲线表示Gap统计值和Gap误差线。最优的聚类数目是在一个标准差里使gap达到最小的聚类数目。由此可见本例中分8类最好。

聚类分析以及R语言实现过程明明同学就给大家介绍到这里。更多R语言数据分析使用技巧、EXCEL和PPT制作教程明明同学会在博客中相继给大家介绍。
有任何问题请评论区会说明并私信明明同学,明明同学帮助你解决数据分析,PPT制作,论文做图、以及高质量图片处理的难处。

版权声明:本文为weixin_42883407原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42883407/article/details/81432882