作者:王亨
个人公众号:跟着菜鸟一起学R语言
聚类分析是一种机器学习领域最常用的分类方法,它在在客户分类,文本分类,基因识别,空间数据处理,卫星图片处理,医疗图像自动检测等领域有着广泛应用。聚类就是将相同,相似的对象划分到同一个组中,聚类分析事前不需要参考任何分类信息,可以通过判断数据表特征的相似性来完成对数据的归类。在聚类分析中,观测值的类别一般情况下是未知的。我们希望将观测值聚类为合适的几个分类。聚类在机器学习中就是无监督学习。今天来介绍一下下面的五种聚类方法和对于R里面的函数。
K-均值聚类(K-Means)
K-中心点聚类(K-Medoids)
系谱聚类(HC)
密度分析(DBSCAN)
期望最大化聚类(EM)
聚类算法思想
K-均值聚类
K均值法:又称快速聚类法,有时也称扁平聚类。将n个对象分成k个簇,簇内高度相似,簇间较低相似。它并不知道训练集中的观测值的类别,它以观测值之间的距离作为度量观测值相似程度的指标,使用迭代的方法训练模型,它和KNN都具有计算简洁的优点,他们同样受聚类个数和初始分布的影响。它的思想是以随机选取的K个样本作为簇的起始中心点或簇的平均值,各个簇中心点的距离,将该对象赋给最近的簇,再计算每个簇的平均值,然后不断重复,直至所有样本所属类为中心。该算法的缺点是易受异常值的干扰。
K-中心点聚类
由于K-均值算法易受极值影响,为了改进这一点缺点,就提出来K-中心点算法。K-均值算法是在当前簇中样本坐标的均值为新的中心点。K-中心点算法在选择各类别中心点时不选取样本均值点,而是选择簇内的每个对象为中心,使得总的代价减少或最小即可。它类别内选取到其余样本距离之和最小的样本为中心,这也保证了总的代价最小。但这也增加了算法的复杂度。K-中心聚类的鲁棒性更好。
系谱聚类
系谱聚类的主要特点是不需要事先设定类别数K,它在每次迭代过程中仅将距离最近的两个样本或簇聚为一类,其过程自然得到k=1至k=n(n为待分类样本总数)个类别的聚类结果。
密度聚类
DBSCAN算法是基于密度的聚类方法中最常用的代表方法之一该算法将分布稠密的样本划分到同一个簇,并过滤掉那些低密度的区域。可以在有噪声的数据中形成任意形状的簇,弥补了前几种算法易受异常值干扰的缺点,因此可以发现各种任意形状的聚类簇。但他也有缺点,就是对定义的半径和密度阈值敏感,稍有不同,结果也会不一样,只能不断调整参数。
期望最大化聚类
期望最大化算法,简称EM算法。该算法在聚类时,它将数据集看作一个含有隐形变量的概率模型,并实现模型最优化。通过“反复估计 ”这也迭代找出最优解,每一次迭代包含两步:第一步求期望值,称为E步,第二步求极大值,称为M步,同时给出相应的最优类别数k。kmeans聚类计算的是距离,该聚类是计算概率。
代码
K-均值算法
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE)
K-中心算法
实现K-中心算法的函数时pam(),它在cluster包里面。这个函数的参数比较多。
pam(x, k, diss = inherits(x, "dist"), metric = "euclidean", medoids = NULL, stand = FALSE, cluster.only = FALSE, do.swap = TRUE, keep.diss = !diss && !cluster.only && n < 100, keep.data = !diss && !cluster.only, pamonce = FALSE, trace.lev = 0)
DBSCAN算法
DBSCAN包里面的dbscan()函数实现了DBSCAN算法,函数具体为:
dbscan(data, eps, MinPts = 5, scale = FALSE, method = c("hybrid", "raw", "dist"), seeds = TRUE, showplot = FALSE, countmode = NULL)
EM聚类算法
在mclust扩展包里面提供了几个函数,Mclust,mclustBIC,mclust2Dplot,densityMclust函数。
Mclust(data, G = NULL, modelNames = NULL, prior = NULL, control = emControl(), initialization = NULL, warn = mclust.options("warn"), x = NULL, verbose = interactive(), ...)
系谱聚类
在stats扩展包里面有三个函数可以进行系谱聚类,每个函数都略有区别。
hclust()函数
hclust(d, method = "complete", members = NULL)
2. cutree函数cutree函数则是对hclust函数的聚类结果进行剪枝。即选择输出指定类别数的系谱聚类结果。剪枝就是说输出指定指定类别数的系谱聚类结果。
cutree(tree, k = NULL, h = NULL)
3. rect.hlcust函数该函数可以对结果进行可视化展现。它是在plot形成的系谱图中指定类别中样本分支并用方框表示出了。
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, cluster = NULL)
往期精彩内容整理合集
2017年R语言发展报告(国内)
R语言中文社区历史文章整理(作者篇)
R语言中文社区历史文章整理(类型篇)
公众号后台回复关键字即可学习
回复 R R语言快速入门及数据挖掘
回复 Kaggle案例 Kaggle十大案例精讲(连载中)
回复 文本挖掘 手把手教你做文本挖掘
回复 可视化 R语言可视化在商务场景中的应用
回复 大数据 大数据系列免费视频教程
回复 量化投资 张丹教你如何用R语言量化投资
回复 用户画像 京东大数据,揭秘用户画像
回复 数据挖掘 常用数据挖掘算法原理解释与应用
回复 机器学习 人工智能系列之机器学习与实践
回复 爬虫 R语言爬虫实战案例分享