前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【V课堂】R语言十八讲(十三)—聚类模型

【V课堂】R语言十八讲(十三)—聚类模型

作者头像
小莹莹
发布2018-04-23 10:02:44
1.1K0
发布2018-04-23 10:02:44
举报

聚类分析是一种原理简单、应用广泛的数据挖掘技术。顾名思义,聚类分析即是把若干事物按照某种标准归为几个类别,其中较为相近的聚为一类,不那么相近的聚于不同类。聚类分析在客户分类、文本分类、基因识别、空间数据处理、卫星图片分析、医疗图像自动检测等领域有着广泛的应用;而聚类分析本身的研究也是一个蓬勃发展的领域,数据分析、统计学、机器学习、空间数据库技术、生物学和市场学也推动了聚类分析研究的进展。聚类分析已经成为数据分析研究中的一个热点。

1

原理

聚类算法种类繁多,且其中绝大多数可以用R实现。下面将选取普及性最广、最实用、最具有代表性的5中聚类算法进行介绍,其中包括:  K-均值聚类(K-Means):它是一种快速聚类方法,但对于异常值或极值敏感,稳定性差,因此适合处理分布集中的大样本数据集。它的思路是以随机选取的k(认为设定)个样本作为起始中心点,将其余样本归入相似度最高中心点所在的簇(cluster),再确立当前簇中样本坐标的均值为新的中心点,依次循环迭代下去,直至所有样本所属类别不再变动。算法的计算过程非常直观,下图以将10个点聚为3类为例展示算法步骤:

 K-中心点聚类(K-Medoids):K-中心点算法与K-均值算法在原理上十分相近,它是针对K-均值算法易受极值影响这一缺点的改进算法。在原理上的差异在于选择各类别中心点时不取类别均值点,而在类别内选取到其余类别距离之和最小的样本点为中心。

下图表示出算法的基本运行步骤:

 密度聚类(Densit-based Spatial Clustering of Application with Noise,DBSCAN):由于层次聚类算法和划分式聚类算往往只能发现凸形的聚类簇。为了弥补这一缺陷,发现各种任意形状的聚类簇,开发出基于密度的聚类算法。这类算法认为,在整个样本空间点中,各目标类簇是由一群的稠密样本点组成的,而这些稠密样本点被低密度区域(噪声)分割,而算法的目的就是要过滤低密度区域,发现稠密样本点。  层次聚类(系谱聚类 Hierarchical Clustering,HC):其聚类的过程可以通过类似于系谱图的形式呈现出来。相比K-均值算法与K-中心点算法,系谱算法的突出特点在于,不需事先设定类别数k,这是因为它每次迭代过程仅将距离最近的两个样本/簇聚为一类,其运作过程将自然得到k=n至k=1(n为待分类样本总数)个类别的聚类结果.

期望最大化聚类(Expectation Maximization,EM) 需要说明的是,这些算法本身无所谓优劣,而最终运用于数据的效果却存在好坏差异,这在很大程度上取决于数据使用者对于算法的选择是否得当。

既然算法都用到了距离这个概念,我们有必要知道数学中距离的计算方法。

距离:距离有很多种,对于连续型变量来说距离的表示方法有如下种类:

在R语言中,使用dist函数可以把一个矩阵或数据框转化为距离矩阵。dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)

2

R实现

1.K-均值算法在R语言中实现的核心函数为kmeans(),来源于stats软件包。该函数的基本格式为:kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd","Forgy", "MacQueen"), trace=FALSE) 其中x为进行聚类分析的数据集; centers为预设类别数k; iter.max为迭代的最大值,且默认值为10; nstart为选择随机起始中心点的次数,默认取1;而参数algorithm则提供了4中算法选择,默认为Hartigan-Wong算法。

案例 : 我们使用iris数据集演示k-means聚类的过程。 iris2<-iris # 移除Species属性 iris2$Species<-NULL # 利用kmeans()函数进行k-means聚类,并将聚类结果储存在变量kmeans.result中。 (kmeans.result<-kmeans(iris2,3))

将聚类结果与类标号(Species)进行比较,查看相似的对象是否被划分到同一个簇中。 # 查看划分效果 table(iris$Species,kmeans.result$cluster)

计算准确率:即对角线上面数字的之和,除以总样本数.

然后,绘制所有的簇和簇中心。 plot(iris2, col=kmeans.result$cluster) # plot cluster centers points(kmeans.result$centers[,c(“Sepal.Length”,”Sepal.Width”)], col=1:3,pch=8,cex=2)

2.系谱聚类:这三个函数都来源于stat软件包,核心函数为hclust(),用来实现系谱聚类算法,其基本格式十分简单,仅含有三个参数: hclust(d, method = “complete”, members = NULL)其中, d为待处理数据集样本间的距离矩阵,可用dist()函数计算得到; method参数用于选择聚类的具体算法,可供选择的有ward、 single及complete等7中,默认选择complete方法;参数members用于指出每个待聚类样本点/簇是由几个单样本构成,该参数默认值为NULL,表示每个样本点本身即为单样本。而cutree()函数则可以对hclust()函数的聚类结果进行剪枝,即选择输出指定类别数的系谱聚类结果。其格式为: cutree(tree,k=NULL,h=NULL)函数rect.hclust()可以在plot()形成的系谱图中将指定类别中的样本分支用方框表示出来,十分有助于直观分析聚类结果。其基本格为:rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, cluster= NULL)

案例 :洛杉矶街区数据(LA.Neighborhoods.csv),这是美国普查局2000年的数据。一共有110个街区, 15个变量。

选择研究变量,将数据标准化,利用hclust建立层次聚类。 w<-read.csv(“~LA.Neighborhoods.csv") w<-data.frame(w,density=w$Population/w$Area) # 选择变量 u<-w[,c(1,2,5,6,11,16)] # 标准化数据,聚类方法="complete" hh<-hclust(dist(scale(u[,-1])),"complete") # 画树状图 plot(hh,labels=w[,1],cex=0.6) # 自动分成5类 rect.hclust(hh,k=5)

3

总结

聚类模型通常是探索性的分析,对于数据没有标签时,我们需要了解数据的能够分为几类,分别是怎么样的,而K-MEANS算法需要我们指定类别数,在实际生活中,我们往往不知道类别数是多少,这时我们可以先用系谱聚类也就是层次聚类求出聚类数,然后我们再用K均值的算法再去聚类,作为验证或对比吧.

未完待续……

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PPV课数据科学社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档