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

聚类分析定义与作用:

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

聚类分析的类型:

是实际问题中,如根据各省主要的经济指标,将全国各省区分成为几个区域等。这个主要的经济指标是我们用来分类的依据。称为指标(变量),用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.051512.88981.131294.072328.512383.961246.19649.66
天津4249.311024.15760.561163.981309.941639.831417.45463.64
河北2789.85975.94546.75833.511010.51895.06917.19266.16
山西2600.371064.61477.74640.221027.991054.05991.77245.07
内蒙古2824.891396.86561.71719.131123.821245.09941.79468.17
辽宁3560.211017.65439.28879.081033.361052.941047.04400.16
吉林2842.681127.09407.35854.8873.88997.751062.46394.29
黑龙江2633.181021.45355.67729.55746.03938.21784.51310.67
上海6125.451330.05959.49857.113153.722653.671412.1763.8
江苏3928.71990.03707.31689.371303.021699.261020.09377.37
浙江4892.581406.2666.02859.062473.42158.321168.08467.52
安徽3384.38906.47465.68554.44891.381169.99850.24309.3
福建4296.22940.72645.4502.411606.91426.341261.18375.98
江西3192.61915.09587.4385.91732.97973.38728.76294.6
山东3180.641238.34661.03708.581333.631191.181027.58325.64
河南2707.441053.13549.14626.55858.33936.55795.39300.19
湖北3455.981046.62550.16525.32903.021120.29856.97242.82
湖南3243.881017.59603.18668.53986.891285.24869.59315.82
广东5056.68814.57853.18752.522966.081994.861444.91454.09
广西3398.09656.69491.03542.07932.871050.04803.04277.43
海南3546.67452.85519.99503.781401.89837.83819.02210.85
重庆3674.281171.15706.77749.511118.791237.35968.45264.01
四川3580.14949.74562.02511.781074.911031.81690.27291.32
贵州3122.46910.3463.56354.52895.041035.96718.65258.21
云南3562.33859.65280.62631.71034.71705.51673.07174.23
西藏3836.51880.1271.29272.81866.33441.02628.35335.66
陕西3063.69910.29513.08678.38866.761230.74831.27332.84
甘肃2824.42939.89505.16564.25861.471058.66768.28353.65
青海2803.45898.54484.71613.24785.27953.87641.93331.38
宁夏2760.74994.47480.84645.98859.04863.36910.68302.17
新疆2760.691183.69475.23598.78890.3896.79736.99331.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制作,论文做图、以及高质量图片处理的难处。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值