三种聚类方法:层次、K均值、密度 Posted 2023-03-27
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种聚类方法:层次、K均值、密度相关的知识,希望对你有一定的参考价值。
参考技术A
一、层次聚类 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
R语言确定聚类的最佳簇数:3种聚类优化方法
确定数据集中最佳的簇数 是分区聚类(例如k均值聚类 )中的一个基本问题,它要求用户指定要生成的簇数k。
一个简单且流行的解决方案包括检查使用分层聚类 生成的树状图,以查看其是否暗示特定数量的聚类。不幸的是,这种方法也是主观的。
我们将介绍用于确定k均值,k medoids(PAM)和层次聚类的最佳聚类数的不同方法。
这些方法包括直接方法和统计测试方法:
直接方法:包括优化准则,例如簇内平方和或平均轮廓之和。相应的方法分别称为弯头 方法和轮廓 方法。
统计检验方法:包括将证据与无效假设进行比较。
除了肘部 ,轮廓 和间隙统计 方法外,还有三十多种其他指标和方法已经发布,用于识别最佳簇数。我们将提供用于计算所有这30个索引的R代码,以便使用“多数规则”确定最佳聚类数。
对于以下每种方法:
我们将描述基本思想和算法
我们将提供易于使用的R代码,并提供许多示例,用于确定最佳簇数并可视化输出。
肘法
回想一下,诸如k-均值聚类之类的分区方法背后的基本思想是定义聚类,以使总集群内变化[或总集群内平方和(WSS)]最小化。总的WSS衡量了群集的紧凑性,我们希望它尽可能小。
Elbow方法将总WSS视为群集数量的函数:应该选择多个群集,以便添加另一个群集不会改善总WSS。
最佳群集数可以定义如下:
针对k的不同值计算聚类算法(例如,k均值聚类)。例如,通过将k从1个群集更改为10个群集。
对于每个k,计算群集内的总平方和(wss)。
根据聚类数k绘制wss曲线。
曲线中拐点(膝盖)的位置通常被视为适当簇数的指标。
平均轮廓法
平均轮廓法计算不同k值的观测值的平均轮廓。聚类的最佳数目k是在k的可能值范围内最大化平均轮廓的数目(Kaufman和Rousseeuw 1990)。
差距统计法
该方法可以应用于任何聚类方法。
间隙统计量将k的不同值在集群内部变化中的总和与数据空引用分布下的期望值进行比较。最佳聚类的估计将是使差距统计最大化的值(即,产生最大差距统计的值)。
资料准备
我们将使用USArrests数据作为演示数据集。我们首先将数据标准化以使变量具有可比性。
Silhouhette和Gap统计方法
简化格式如下:
下面的R代码确定k均值聚类的最佳聚类数:
## Clustering k = 1,2,..., K.max (= 10): .. done
## Bootstrapping, b = 1,2,..., B (= 50) [one "." per sample]:
## .................................................. 50
? ?
根据这些观察,有可能将k = 4定义为数据中的最佳簇数。
30个索引,用于选择最佳数目的群集
数据 :矩阵
diss :要使用的相异矩阵。默认情况下,diss = NULL,但是如果将其替换为差异矩阵,则距离应为“ NULL”
distance :用于计算差异矩阵的距离度量。可能的值包括“ euclidean”,“ manhattan”或“ NULL”。
min.nc,max.nc :分别为最小和最大簇数
要为kmeans 计算NbClust (),请使用method =“ kmeans”。
要计算用于层次聚类的NbClust (),方法应为c(“ ward.D”,“ ward.D2”,“ single”,“ complete”,“ average”)之一。
下面的R代码为k均值计算:
## Among all indices:
## ===================
## * 2 proposed 0 as the best number of clusters
## * 10 proposed 2 as the best number of clusters
## * 2 proposed 3 as the best number of clusters
## * 8 proposed 4 as the best number of clusters
## * 1 proposed 5 as the best number of clusters
## * 1 proposed 8 as the best number of clusters
## * 2 proposed 10 as the best number of clusters
##
## Conclusion
## =========================
## * According to the majority rule, the best number of clusters is 2 .
?
根据多数规则,最佳群集数为2。
如果您有任何疑问,请在下面发表评论。
?
大数据部落 -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和统计分析咨询服务
统计分析和数据挖掘咨询服务:y0.cn/teradat (咨询服务请联系官网客服 )
? QQ:3025393450
?QQ交流群:186388004
【服务场景】
科研项目; 公司项目外包;线上线下一对一培训;数据爬虫采集;学术研究;报告撰写;市场调查。
【大数据部落】 提供定制化的一站式数据挖掘和统计分析咨询
欢迎选修我们的R语言数据分析挖掘必知必会 课程!
以上是关于三种聚类方法:层次、K均值、密度的主要内容,如果未能解决你的问题,请参考以下文章
R语言确定聚类的最佳簇数:3种聚类优化方法
四种聚类方法之比较
一文盘点6种聚类算法,数据科学家必备!
K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?
聚类算法都有哪些
五种聚类算法一览与python实现