基于R语言的数据挖掘之聚类算法--基于密度方法
Posted 数据分析1480
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于R语言的数据挖掘之聚类算法--基于密度方法相关的知识,希望对你有一定的参考价值。
前文《基于R语言的数据挖掘之聚类算法--划分方法》和《基于R语言的数据挖掘之聚类算法--层次方法》中提到这两类方法旨在发现球状簇,它们很难发现任意形状的簇。所谓非球状簇,可见下图:
图中为“S”形和椭圆形簇,如果通过划分方法和层次方法很可能无法正确地判别类,而且图中的噪声或离群点还包含在簇中。
往往现实的数据中,其簇确实表现为非球形簇,为了能够发现任意形状的簇,可以采用基于密度的聚类方法,这里重点讲解一下DBSCAN算法。
首先了解一下DBSCAN算法是如何工作的:
DBSCAN算法将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在“噪声”的空间中现实任意形状的聚类。
在DBSCAN算法中需要了解一下6个概念:
1)对象的eps-邻域:给定对象在半径eps内的区域;
2)核心对象:如果一个对象的eps-邻域至少包括最小数目MinPts个对象,则称该对象为核心对象;
3)直接密度可达:给定一个对象集合D,如果p是在q的eps-邻域内,而q是一个核心对象,则对象p从对象q出发是直接密度可达的;
4)密度可达的:如果存在一个对象链p1,p2,...,pn,p1=q,pn=p,对数据集合D中的pi,pi+1是从pi关于eps和MinPts直接密度可达的,则对象p是从对象关于q关于eps和MinPts密度可达的;
5)密度相连的:若对象集合D中存在一个对象o,使得对象p和q是从o关于eps和MinPts密度可达的,则对象p和q是关于eps和MinPts密度相连的;
6)噪声:不包含在任何簇中的对象。
上面的6条定义可能不是很好理解,下面我们用图的方式介绍一下这6个定义:
假设图中圆的半径为eps,MinPts为3。
“核心对象”就是以集合D中的任意一点为中心,eps为半径作圆,且要求圆中包含3个及以上的点。从图中可知点M、点P、点O和点R为“核心对象”;
“直接密度可达”就是核心对象半径内的点。图中显示Q是从点M出发的“直接密度可达”,M是从点P出发的“直接密度可达”;
“密度可达”可以理解为由核心对象衍生出去的直接密度可达。显然图中的Q是从P“密度可达”,同样,S和R从O是“密度可达”;
“密度相连”指具有公共核心对象的密度可达。图中点S、点O和点R即为“密度相连”。
DBSCAN算法步骤:
输入:包含n个对象的集合D,指定半径eps和最少数目MinPts。
输出:所有生成的簇,达到密度要求。
1)repeat
2)从集合D中抽取一个未处理的点;
3)如果抽出的点是核心点,则找出所有从该点出发的密度可达对象,形成簇;
4)如果抽出点的为非核心点,则跳出循环,寻找下一个点;
5)until所有点都被处理。
这里用一个简单的例子叙述DBSCAN算法步骤,以说明该方法的思路和操作过程:
首先看一下数据集合D:
第1步:在集合D中选择点1,以它为圆心,1为半径画圆,发现仅有2个点在圆内,因此点1不为核心点,选择下一个点;
第2步:在集合D中选择点2,以它为圆心,1为半径画圆,发现仅有2个点在圆内,因此点2不为核心点,选择下一个点;
第3步:在集合D中选择点3,以它为圆心,1为半径画圆,发现仅有3个点在圆内,因此点3不为核心点,选择下一个点;
第4步:在集合D中选择点4,以它为圆心,1为半径画圆,发现有5个点在圆内,因此点4为核心点,接着寻找从该点出发的直接可达。聚成新类{1,3,4,5,9,10,12},完成后继续选择下一个点;
第5步:在集合D中选择点5,发现该点已在簇1中,选择下一个点;
第6步:在集合D中选择点6,以它为圆心,1为半径画圆,发现仅有3个点在圆内,因此点6不为核心点,选择下一个点;
第7步:在集合D中选择点7,以它为圆心,1为半径画圆,发现有5个点在圆内,因此点7也为核心点,接着寻找从该点出发的直接可达。聚成新类{2,6,7,8,11},完成后继续选择下一个点;
第8步:在集合D中选择点8,发现该点已在簇2中,选择下一个点;
第9步:在集合D中选择点9,发现该点已在簇1中,选择下一个点;
第10步:在集合D中选择点10,发现该点已在簇1中,选择下一个点;
第11步:在集合D中选择点11,发现该点已在簇2中,选择下一个点;
第12步:在集合D中选择点12,发现该点已在簇1中,此时所有点都被处理过,程序结束。
通过这一流程下来,发现这12个点的集合D可以形成2个簇。
应用:
R语言中可以使用fpc包中的dbscan函数实现基于密度的聚类算法,首先介绍一下该函数的语法即参数:
dbscan(data, eps, MinPts = 5, scale = FALSE,
method = c("hybrid","raw","dist"),
seeds = TRUE, showplot = FALSE, countmode = NULL)
data为一个矩阵或数据框或非相似矩阵或距离矩阵(当data为距离矩阵时,参数method需要指定为‘dist’);
eps为半径;
MinPts指定eps半径下圆中的最少数目对象;
scale为逻辑参数,是否指定标准化原数据data;
method指定算法采用数据的方法(当data为dist距离矩阵时,‘dist'方法运算非常快,但也非常消耗内存;当data为原始数据时,'raw'方法可以节省内存,但会使运算过程非常缓慢;'hybrid'方法要求data为原始数据,但在运算过程中使用距离矩阵,这样既能提高运算速度,又能缓和内存消耗);
showplot指定绘图方式。
下面对半径eps和最小数目MinPts取不同的值,比较算法结果的异同:
1、假设半径eps=0.4,最小数目MinPts=4时:
结果聚为5类,第1、第2和第3类占大多数。
2、假设半径eps=0.4,最小数目MinPts=5时:
结果仍聚为5类,但第3和第4类发生很大变化。
3、假设半径eps=0.6,最小数目MinPts=4时:
结果聚为4类,其中第2类占了92例。
4、假设半径eps=0.6,最小数目MinPts=5时:
结果聚为3类,原本第3类都归到了第0类。
通过以上4种参数的设置,发现结果之间还是存在很大差异的。
DBSCAN聚类算法的缺点:
1)需要为算法指定eps和MinPts参数,这对分析人员是一个很大的挑战;
2)从上述的4种结果可知,DBSCAN聚类算法对参数eps和MinPts的设置是非常敏感的,如果指定不当,该算法将造成聚类质量的下降。
心得:
虽然基于密度的聚类算法可以弥补划分方法和层次方法无法实现的非球形聚类,但是该算法需要指定准确的eps和MinPts。这两个参数的设置需要根据实际的业务情况给出合理的值,要么进行不停的尝试以求最佳的参数值。
以上是关于基于R语言的数据挖掘之聚类算法--基于密度方法的主要内容,如果未能解决你的问题,请参考以下文章