聚类分析定义与作用:
是把分类对象按照一定规则分成若干类,这些类不是事先设定的,而是根据数据的特征确定的。在同一类中这些对象在某种意义上趋向于彼此相似,而在不同类中对象趋向于彼此不相似。在经济、管理、地质勘探、天气预报、生物分类、考古学、医学、心理学以及制定国家标准和区域标准等许多方面应用十分广泛,是国内外较为流行的多变量统计分析方法之一。
聚类分析的类型:
是实际问题中,如根据各省主要的经济指标,将全国各省区分成为几个区域等。这个主要的经济指标是我们用来分类的依据。称为指标(变量),用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)
可以看出不同距离方法的分类结果有所差异,但大体的结果是一致的, 北京、上海、浙江、天津、广东消费水平和其他省市自治区有较明显的区别,符合实际情况。
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达到最小的聚类数目。由此可见本例中分8类最好。
聚类分析以及R语言实现过程明明同学就给大家介绍到这里。更多R语言数据分析使用技巧、EXCEL和PPT制作教程明明同学会在博客中相继给大家介绍。