1.准备工作
(1) 研究目的
聚类分析是根据事物本身的特性研究个体分类的方法,聚类分析的原则是同一类别的个体有较大相似性,不同类别的个体差异比较大。
(2) 数据类型
1)定量:数字有比较意义,比如数字越大代表满意度越高,量表为典型定量数据。
2)定类:数字无比较意义,比如性别,1代表男,2代表女。
PS: SPSSAU会根据数据类型自动选择聚类方法。
K-modes聚类: 数据类型仅定类时。
2.上传数据到SPSSAU
登录账号后进入SPSSAU页面,点击右上角“上传数据”,将处理好的数据进行“点击上传文件”上传即可。
3.SPSSAU *** 作
(1)拖拽分析项
1) SPSSAU进阶方法→聚类。
2)检查
检查分析项是否都在左侧分析框中。
3)进行拖拽
(2)选择参数
聚类个数: 聚类个数设置为几类主要以研究者的研究思路为标准,如果不进行设置,SPSSAU默认聚类个数为3,通常情况下,建议设置聚类数量介于3~6个之间。
标准化: 聚类算法是根据距离进行判断类别,因此一般需要在聚类之前进行标准化处理,SPSSAU默认是选中进行标准化处理。数据标准化之后,数据的相对大小意义还在(比如数字越大GDP越高),但是实际意义消失了。
保存类别: 分析选择保存‘保存类别’,SPSSAU会生成 新标题 用于标识,也可以右上角“我的数据”处查看到分析后的“聚类类别”。
新标题类似如下:Cluster_********。
4.SPSSAU分析
(1)聚类类别基本情况汇总分析
使用聚类分析对样本进行分类,使用Kmeans聚类分析方法,从上表可以看出:最终聚类得到4类群体,此4类群体的占比分别是20.00%, 30.00%, 20.00%, 30.00%。整体来看, 4类人群分布较为均匀,整体说明聚类效果较好。
(2)聚类类别汇总图分析
上图可以直观的看到各个类别所占百分比,4类群体的占比分别是20.00%, 30.00%, 20.00%, 30.00%。
(3)聚类类别方差分析差异对比
使用方差分析去探索各个类别的差异特征,从上表可知:聚类类别群体对于所有研究项均呈现出显著性(p<0.05),意味着聚类分析得到的4类群体,他们在研究项上的特征具有明显的差异性,具体差异性可通过平均值进行对比,并且最终结合实际情况,对聚类类别进行命名处理。
(4)聚类项重要性对比
从上述结果看,所有研究项均呈现出显著性,说明不同类别之间的特征有明显的区别,聚类的效果较好。
(5)聚类中心
5.其它说明
(1)聚类中心是什么?
聚类中心是聚类类别的中心点情况,比如某类别时年龄对应的聚类中心为20,意味着该类别群体年龄基本在20岁左右。初始聚类中心基本无意义,它是聚类算法随机选择的聚类点,如果需要查看聚类中心情况,需要关注于最终聚类中心。实际分析时聚类中心的意义相对较小,其仅为聚类算法的计算值而已。
(2)k-prototype聚类是什么?
如果说聚类项中包括定类项,那么SPSSAU默认会进行K-prototype聚类算法(而不是kmeans算法)。定类数据不能通过数字大小直接分析距离,因而需要使用K-prototype聚类算法。
(3)聚类分析时SSE是什么意思?
在进行Kmeans聚类分析时SPSSAU默认输出误差平方和SSE值,该值可用于测量各点与中心点的距离情况,理论上是希望越小越好,而且如果同样的数据,聚类类别越多则SSE值会越小(但聚类类别过多则不便于分析)。
SSE指标可用于辅助判断聚类类别个数,建议在不同聚类类别数量情况下记录下SSE值,然后分析SSE值的减少幅度情况,如果发现比如从3个聚类到4个类别时SSE值减少幅度明显很大,那么此时选择4个聚类类别较好。
二、分层聚类
1.准备工作
(1)研究目的
从分析角度上看,聚类分析可分为两种,一种是按样本(或个案)聚类,此类聚类的代表是K-means聚类方法;另外一种是按变量(或标题)聚类,此类聚类的代表是分层聚类。
(2)数据类型
2.上传数据到SPSSAU
登录账号后进入SPSSAU页面,点击右上角“上传数据”,将处理好的数据进行“点击上传文件”上传即可。
3.SPSSAU *** 作
(1)拖拽分析项
1) SPSSAU进阶方法→分层聚类。
2)检查
检查分析项是否都在左侧分析框中。
3)进行拖拽
(2)确定参数
SPSSAU会默认聚类为3类并且呈现表格结果,如果希望更多的类别个数,可自行进行设置。
4.SPSSAU分析
(1)聚类项描述分析
上表格展示总共8个分析项(即8个裁判数据)的基本情况,包括均值,最大或者最小值,中位数等,以便对于基础数据有个概括性了解。整体上看,8个裁判的打分基本平均在8分以上。
(2)聚类类别分布表分析
总共聚类为3个类别,以及具体分析项的对应关系情况。在上表格中展示出来,上表格可以看出:裁判8单独作为一类;裁判5,3,7这三个聚为一类;以及裁判1,6,2,4作为一类。
(PS:聚类类别与分析项上的对应关系可以在上表格中得到,同时也可以查看聚类树状图得出更多信息。至于聚类类别分别应该叫做什么名字,这个需要结合对应有关系情况,自己单独进行命名。)
(3)聚类树状图分析
上图为聚类树状图的展示,聚类树状图是将聚类的具体过程用图示法手法进行展示;最上面一行的数字仅仅是一个刻度单位,代表相对距离大小;一个结点表示一次聚焦过程。
树状图的解读上,建议单独画一条垂直线,然后对应查看分成几个类别,以及每个类别与分析项的对应关系。比如上图中,红色垂直线最终会拆分成3个类别;第1个类别对应裁判8;第2个类别对应裁判5,3,7;第3个类别对应裁判1,6,2,4。
如果是聚为四类;从上图可看出,明显的已经不再合适。原因在于垂直线不好区分成四类。也即说明有2个类别本应该在一起更合适(上图中的裁判1与6/2/4);但是如果分成4类,此时裁判1会单独成一类。所以画垂直线无法区分出类别。因而综合分析来看,最终聚类为3个类别最为适合。
当然在分析时也可以考虑分成2个类别,此时只需要对应将垂直线移动即可。
5.其它说明
(1)针对分层聚类,需要注意以下几点:
(2)什么时候做因子分析后再做聚类分析?
如果题项较多,可先做因子分析,得到每个维度(因子)的数据,再进行聚类。
三、总结
聚类分析广泛的应用于自然科学、社会科学等领域。在分析时可以比较多次聚类结果,综合选择更适合的方案。
以上就是聚类分析步骤汇总,更多干货请前往官网查看!
一、层次聚类
1)距离和相似系数
r语言中使用dist(x, method = "euclidean",diag = FALSE, upper = FALSE, p = 2) 来计算距离。其中x是样本矩阵或者数据框。method表示计算哪种距离。method的取值有:
euclidean 欧几里德距离,就是平方再开方。
maximum 切比雪夫距离
manhattan 绝对值距离
canberra Lance 距离
minkowski 明科夫斯基距离,使用时要指定p值
binary 定性变量距离.
定性变量距离: 记m个项目里面的 0:0配对数为m0 ,1:1配对数为m1,不能配对数为m2,距离=m1/(m1+m2)
diag 为TRUE的时候给出对角线上的距离。upper为TURE的时候给出上三角矩阵上的值。
r语言中使用scale(x, center = TRUE, scale = TRUE) 对数据矩阵做中心化和标准化变换。
如只中心化 scale(x,scale=F) ,
r语言中使用sweep(x, MARGIN, STATS, FUN="-", ...) 对矩阵进行运算。MARGIN为1,表示行的方向上进行运算,为2表示列的方向上运算。STATS是运算的参数。FUN为运算函数,默认是减法。下面利用sweep对矩阵x进行极差标准化变换
?
1
2
3
>center <-sweep(x, 2, apply(x, 2, mean)) #在列的方向上减去均值。
>R <-apply(x, 2, max) -apply(x,2,min) #算出极差,即列上的最大值-最小值
>x_star <-sweep(center, 2, R, "/") #把减去均值后的矩阵在列的方向上除以极差向量
?
1
2
3
>center <-sweep(x, 2, apply(x, 2, min)) #极差正规化变换
>R <-apply(x, 2, max) -apply(x,2,min)
>x_star <-sweep(center, 2, R, "/")
有时候我们不是对样本进行分类,而是对变量进行分类。这时候,我们不计算距离,而是计算变量间的相似系数。常用的有夹角和相关系数。
r语言计算两向量的夹角余弦:
?
1
2
y <-scale(x, center =F, scale =T)/sqrt(nrow(x)-1)
C <-t(y) %*%y
相关系数用cor函数
2)层次聚类法
层次聚类法。先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再计算类与类之间的距离,将距离最近的类合并为一个大类。不停的合并,直到合成了一个类。其中类与类的距离的计算方法有:最短距离法,最长距离法,中间距离法,类平均法等。比如最短距离法,将类与类的距离定义为类与类之间样本的最段距离。。。
r语言中使用hclust(d, method = "complete", members=NULL) 来进行层次聚类。
其中d为距离矩阵。
method表示类的合并方法,有:
single 最短距离法
complete 最长距离法
median 中间距离法
mcquitty 相似法
average 类平均法
centroid 重心法
ward 离差平方和法
?
1
2
3
4
5
6
7
8
> x <-c(1,2,6,8,11) #试用一下
> dim(x) <-c(5,1)
> d <-dist(x)
> hc1 <-hclust(d,"single")
> plot(hc1)
> plot(hc1,hang=-1,type="tirangle") #hang小于0时,树将从底部画起。
#type = c("rectangle", "triangle"),默认树形图是方形的。另一个是三角形。
#horiz TRUE 表示竖着放,FALSE表示横着放。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> z <-scan()
1: 1.0000.8460.8050.8590.4730.3980.3010.382
9: 0.8461.0000.8810.8260.3760.3260.2770.277
17: 0.8050.8811.0000.8010.3800.3190.2370.345
25: 0.8590.8260.8011.0000.4360.3290.3270.365
33: 0.4730.3760.3800.4361.0000.7620.7300.629
41: 0.3980.3260.3190.3290.7621.0000.5830.577
49: 0.3010.2770.2370.3270.7300.5831.0000.539
57: 0.3820.4150.3450.3650.6290.5770.5391.000
65:
Read 64items
> names
[1] "shengao""shoubi""shangzhi""xiazhi""tizhong"
[6] "jingwei""xiongwei""xiongkuang"
> r <-matrix(z,nrow=8,dimnames=list(names,names))
> d <-as.dist(1-r)
> hc <-hclust(d)
> plot(hc)
然后可以用rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,border = 2, cluster = NULL)来确定类的个数。 tree就是求出来的对象。k为分类的个数,h为类间距离的阈值。border是画出来的颜色,用来分类的。
?
1
2
3
> plot(hc)
> rect.hclust(hc,k=2)
> rect.hclust(hc,h=0.5)
result=cutree(model,k=3) 该函数可以用来提取每个样本的所属类别
二、动态聚类k-means
层次聚类,在类形成之后就不再改变。而且数据比较大的时候更占内存。
动态聚类,先抽几个点,把周围的点聚集起来。然后算每个类的重心或平均值什么的,以算出来的结果为分类点,不断的重复。直到分类的结果收敛为止。r语言中主要使用kmeans(x, centers, iter.max = 10, nstart = 1, algorithm =c("Hartigan-Wong", "Lloyd","Forgy", "MacQueen"))来进行聚类。centers是初始类的个数或者初始类的中心。iter.max是最大迭代次数。nstart是当centers是数字的时候,随机集合的个数。algorithm是算法,默认是第一个。
?
使用knn包进行Kmean聚类分析
将数据集进行备份,将列newiris$Species置为空,将此数据集作为测试数据集
>newiris <- iris
>newiris$Species <- NULL
在数据集newiris上运行Kmean聚类分析, 将聚类结果保存在kc中。在kmean函数中,将需要生成聚类数设置为3
>(kc <- kmeans(newiris, 3))
K-means clustering with 3 clusters of sizes 38, 50, 62: K-means算法产生了3个聚类,大小分别为38,50,62.
Cluster means: 每个聚类中各个列值生成的最终平均值
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.006000 3.428000 1.462000 0.246000
2 5.901613 2.748387 4.393548 1.433871
3 6.850000 3.073684 5.742105 2.071053
Clustering vector: 每行记录所属的聚类(2代表属于第二个聚类,1代表属于第一个聚类,3代表属于第三个聚类)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[37] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[73] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3
[109] 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
[145] 3 3 2 3 3 2
Within cluster sum of squares by cluster: 每个聚类内部的距离平方和
[1] 15.15100 39.82097 23.87947
(between_SS / total_SS = 88.4 %) 组间的距离平方和占了整体距离平方和的的88.4%,也就是说各个聚类间的距离做到了最大
Available components: 运行kmeans函数返回的对象所包含的各个组成部分
[1] "cluster" "centers" "totss" "withinss"
[5] "tot.withinss" "betweenss" "size"
("cluster"是一个整数向量,用于表示记录所属的聚类
"centers"是一个矩阵,表示每聚类中各个变量的中心点
"totss"表示所生成聚类的总体距离平方和
"withinss"表示各个聚类组内的距离平方和
"tot.withinss"表示聚类组内的距离平方和总量
"betweenss"表示聚类组间的聚类平方和总量
"size"表示每个聚类组中成员的数量)
创建一个连续表,在三个聚类中分别统计各种花出现的次数
>table(iris$Species, kc$cluster)
1 2 3
setosa 0 50 0
versicolor 2 0 48
virginica 36 0 14
根据最后的聚类结果画出散点图,数据为结果集中的列"Sepal.Length"和"Sepal.Width",颜色为用1,2,3表示的缺省颜色
>plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster)
在图上标出每个聚类的中心点
〉points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)
三、DBSCAN
动态聚类往往聚出来的类有点圆形或者椭圆形。基于密度扫描的算法能够解决这个问题。思路就是定一个距离半径,定最少有多少个点,然后把可以到达的点都连起来,判定为同类。在r中的实现
dbscan(data, eps, MinPts, scale, method, seeds, showplot, countmode)
其中eps是距离的半径,minpts是最少多少个点。 scale是否标准化(我猜) ,method 有三个值raw,dist,hybird,分别表示,数据是原始数据避免计算距离矩阵,数据就是距离矩阵,数据是原始数据但计算部分距离矩阵。showplot画不画图,0不画,1和2都画。countmode,可以填个向量,用来显示计算进度。用鸢尾花试一试
?
1
2
3
4
5
6
7
8
9
10
11
> install.packages("fpc", dependencies=T)
> library(fpc)
> newiris <-iris[1:4]
> model <-dbscan(newiris,1.5,5,scale=T,showplot=T,method="raw")# 画出来明显不对 把距离调小了一点
> model <-dbscan(newiris,0.5,5,scale=T,showplot=T,method="raw")
> model #还是不太理想……
dbscan Pts=150MinPts=5eps=0.5
012
border 34518
seed 04053
total 344571
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)