王亨:个人公众号:跟着菜鸟一起学R语言
聚类分析是一种机器学习领域最常用的分类方法,它在在客户分类,文本分类,基因识别,空间数据处理,卫星图片处理,医疗图像自动检测等领域有着广泛应用。聚类就是将相同,相似的对象划分到同一个组中,聚类分析事前不需要参考任何分类信息,可以通过判断数据表特征的相似性来完成对数据的归类。在聚类分析中,观测值的类别一般情况下是未知的。我们希望将观测值聚类为合适的几个分类。聚类在机器学习中就是无监督学习。今天来介绍一下下面的五种聚类方法和对于R里面的函数。
K-均值聚类(K-Means)
K-中心点聚类(K-Medoids)
系谱聚类(HC)
密度分析(DBSCAN)
期望最大化聚类(EM)
K均值法:又称快速聚类法,有时也称扁平聚类。将n个对象分成k个簇,簇内高度相似,簇间较低相似。它并不知道训练集中的观测值的类别,它以观测值之间的距离作为度量观测值相似程度的指标,使用迭代的方法训练模型,它和KNN都具有计算简洁的优点,他们同样受聚类个数和初始分布的影响。它的思想是以随机选取的K个样本作为簇的起始中心点或簇的平均值,各个簇中心点的距离,将该对象赋给最近的簇,再计算每个簇的平均值,然后不断重复,直至所有样本所属类为中心。该算法的缺点是易受异常值的干扰。
由于K-均值算法易受极值影响,为了改进这一点缺点,就提出来K-中心点算法。K-均值算法是在当前簇中样本坐标的均值为新的中心点。K-中心点算法在选择各类别中心点时不选取样本均值点,而是选择簇内的每个对象为中心,使得总的代价减少或最小即可。它类别内选取到其余样本距离之和最小的样本为中心,这也保证了总的代价最小。但这也增加了算法的复杂度。K-中心聚类的鲁棒性更好。
系谱聚类的主要特点是不需要事先设定类别数K,它在每次迭代过程中仅将距离最近的两个样本或簇聚为一类,其过程自然得到k=1至k=n(n为待分类样本总数)个类别的聚类结果。
DBSCAN算法是基于密度的聚类方法中最常用的代表方法之一该算法将分布稠密的样本划分到同一个簇,并过滤掉那些低密度的区域。可以在有噪声的数据中形成任意形状的簇,弥补了前几种算法易受异常值干扰的缺点,因此可以发现各种任意形状的聚类簇。但他也有缺点,就是对定义的半径和密度阈值敏感,稍有不同,结果也会不一样,只能不断调整参数。
期望最大化算法,简称EM算法。该算法在聚类时,它将数据集看作一个含有隐形变量的概率模型,并实现模型最优化。通过“反复估计 ”这也迭代找出最优解,每一次迭代包含两步:第一步求期望值,称为E步,第二步求极大值,称为M步,同时给出相应的最优类别数k。kmeans聚类计算的是距离,该聚类是计算概率。
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种算法 |
trace | 逻辑值,为真时,则产生跟踪算法进度的信息 |
实现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)
函数 | 作用 |
---|---|
x | 数据集 |
k | 类别数 |
metric | 选择样本间距离测算的距离 |
medoids | 默认是null,选择初始中心点样本 |
stand | 数据在聚类前是否需要标准化 |
cluster.only | 是否仅获取各样本所归属的类别,若选择true,则效率更高一些 |
keep.data | 是否在聚类结果中保存数据集 |
keep.diss | 是否将不相似的或输入数据保存在结果中 |
DBSCAN包里面的dbscan()函数实现了DBSCAN算法,函数具体为:
dbscan(data, eps, MinPts = 5, scale = FALSE, method = c("hybrid", "raw", "dist"), seeds = TRUE, showplot = FALSE, countmode = NULL)
参数 | 作用 |
---|---|
data | 数据集或距离矩阵 |
eps | 划分考察领域半径 |
minPts | 密度阈值 |
scale | 数据是否进行标准化 |
method | 如何看待数据集,hybrid", 表示数据是距离矩阵,"raw",表示数据是原始数据,"dist"表示原始数据 |
showplot | 是否输出聚类结果示意图,0,1,2分别表示不绘图,每次迭代都绘图,仅迭代过程绘图 |
countmode | 默认是null,也可以是一个数字向量 |
在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(), ...)
参数 | 作用 |
---|---|
data | 待处理数据 |
G | 预设类别数,默认是1-9 |
modelNames | 设定模型类别 |
prior | 优先级,默认是没有的但它的共轭先验是根据平均值和方差。当模型比较多的时候可能会用。 |
control | EM算法的一个参数,默认调用emControl() |
warn | 是否放出警告,默认是 mclust.options函数 |
X | 与BIC有关的一个参数 |
verbose | 默认是true,它在计算过程不显示。如果需要交互,则为false |
如果要对结果进行可视化,可以使用mclust2Dplot函数。
在stats扩展包里面有三个函数可以进行系谱聚类,每个函数都略有区别。
hclust()函数
hclust(d, method = "complete", members = NULL)
参数 | 作用 |
---|---|
d | 待处理数据样本间的距离矩阵 |
method | 可选择具体的算法, 有"ward.D", "ward.D2", "single", "complete", "average" , "mcquitty" , "median" 或 "centroid" |
menbers | 指出每个待聚类样本点由几个单样本构成 |
2. cutree函数cutree函数则是对hclust函数的聚类结果进行剪枝。即选择输出指定类别数的系谱聚类结果。剪枝就是说输出指定指定类别数的系谱聚类结果。
cutree(tree, k = NULL, h = NULL)
参数 | 作用 |
---|---|
tree | hclust的结果 |
k | 控制得到几个簇 |
h | 控制需要剪点树的高度 |
3. rect.hlcust函数该函数可以对结果进行可视化展现。它是在plot形成的系谱图中指定类别中样本分支并用方框表示出了。
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, cluster = NULL)
参数 | 作用 |
---|---|
tree | hclust函数的结果 |
k,h | 标量,切割使产生K个簇或者在高度为h处切割 |
which | 是一个向量,可以在指定簇上面用矩阵标注出来,与X不能同时设置参数。 |
x | 从左到右,按数字聚类,x选择包含相应水平坐标的聚类。 默认是 1:k。 |
border | 绘制图片矩阵的颜色 |
公众号后台回复关键字即可学习
回复 R R语言快速入门及数据挖掘
回复 Kaggle案例 Kaggle十大案例精讲(连载中)
回复 文本挖掘 手把手教你做文本挖掘
回复 可视化 R语言可视化在商务场景中的应用
回复 大数据 大数据系列免费视频教程
回复 量化投资 张丹教你如何用R语言量化投资
回复 用户画像 京东大数据,揭秘用户画像
回复 数据挖掘 常用数据挖掘算法原理解释与应用
回复 机器学习 人工智能系列之机器学习与实践
回复 爬虫 R语言爬虫实战案例分享