基于weka的数据库挖掘➖聚类方法#DBSCAN算法
关于作者
- 作者介绍
🍓 博客主页:作者主页
🍓 简介:JAVA领域优质创作者🥇、一名初入职场小白🎓、曾在校期间参加各种省赛、国赛,斩获一系列荣誉🏆
🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨💻
目标
掌握weka中数据聚类的具体流程
内容
利用weka实现K-means聚类和DBSCAN聚类
密度聚类方法
密度聚类方法的指导思想是,只要一个区域中的点的密度大于某个域值,就把它加到与之相近的聚类中去。
这类算法能克服基于距离的算法只能发现“类圆形”的聚类的缺点,可发现任意形状的聚类,且对噪声数据不敏感但计算密度单元的计算复杂度大,需要建立空间索引来降低计算量,且对数据维数的伸缩性较差。
这类方法需要扫描整个数据库,每个数据对象都可能引起一次查询,因此当数据量大时会造成频繁的I/O操作。代表算法有:DBSCAN、OPTICS、DENCLUE算法等。
DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在有“噪声”的空间数据库中发现任意形状的聚类。
概念初识
对象的ε-邻域:给定对象在半径ε内的区域。
核心对象:如果一个对象的ε-邻域至少包含最小数目MinPts个对象,则称该对象为核心对象。
例如,在图5-6中,ε=1cm,MinPts=5,q是一个核心对象。
直接密度可达:给定一个对象集合D,如果p是在q的ε-邻域内,而q是一个核心对象,我们说对象p从对象q出发是直接密度可达的。
例如,在图5-6中,ε=1cm,MinPts=5,q是一个核心对象,对象p从对象q出发是直接密度可达的。
密度可达:如果存在一个对象链p1,p2,…,pn,p1=q,pn=p,对pi∈D,(1<=i<=n),pi+1是从pi关于ε和MitPts直接密度可达的,则对象p是从对象q关于ε和MinPts密度可达的。
例如,在图5-7中,ε=1cm,MinPts=5,q是一个核心对象,p1是从q关于ε和MitPts直接密度可达,p是从p1关于ε和MitPts直接密度可达,则对象p从对象q关于ε和MinPts密度可达的。
密度相连:如果对象集合D中存在一个对象o,使得对象p和q是从o关于ε和MinPts密度可达的,那么对象p和q是关于ε和MinPts密度相连的。
噪声:一个基于密度的簇是基于密度可达性的最大的密度相连对象的集合。不包含在任何簇中的对象被认为是“噪声”。
DBSCAN通过检查数据集中每个对象的ε-邻域来寻找聚类。如果一个点p的ε-邻域包含多于MinPts个对象,则创建一个p作为核心对象的新簇。然后,DBSCAN反复地寻找从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并。当没有新的点可以被添加到任何簇时,该过程结束。具体如下:
DBSCAN算法描述
输入:包含n个对象的数据库,半径ε,最少数目MinPts。
输出:所有生成的簇,达到密度要求。
- REPEAT
- 从数据库中抽取一个未处理过的点;
- IF 抽出的点是核心点 THEN找出所有从该点密度可达的对象,形成一个簇
- ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一点;
- UNTIL 所有点都被处理;
下面给出一个样本事务数据库(见左表),对它实施DBSCAN算法。 根据所给的数据通过对其进行DBSCAN算法,以下为算法的步骤(设n=12,用户输入ε=1,MinPts=4)
样本数据库:
数据对象ID | X | Y |
---|---|---|
1 | 2 | 3 |
2 | 5 | 4 |
3 | 2 | 8 |
4 | 1 | 2 |
5 | 6 | 9 |
6 | 7 | 8 |
7 | 9 | 4 |
8 | 8 | 2 |
9 | 6 | 1 |
10 | 3 | 7 |
11 | 9 | 6 |
12 | 4 | 6 |
步骤:
第1步,初始化参数:n=12, ε=1, MinPts=4。
第2步,创建一个空的簇集合。
第3步,从数据库中选择一个未处理过的点作为当前点。我们选择数据对象ID为1的点作为起始点。
第4步,计算起始点的ε-邻域内的点数。在半径ε=1内,数据对象ID为1的点的邻域内有数据对象ID为2和数据对象ID为4。
第5步,判断起始点是否为核心点。由于邻域内的点数(2个)大于等于MinPts(4),数据对象ID为1的点被判断为核心点。
第6步,创建一个新的簇,并将数据对象ID为1的点加入到该簇中。
第7步,对于核心点数据对象ID为1的点,找出所有从该点密度可达的对象。在半径ε=1内,数据对象ID为1的点的密度可达对象有数据对象ID为2和数据对象ID为4。
第8步,将密度可达的对象数据对象ID为2和数据对象ID为4加入到当前簇中。
第9步,对于加入到簇中的点,重复步骤7和步骤8,继续找出从它们密度可达的对象,并将其加入到簇中。在此示例中,数据对象ID为2的点的密度可达对象为空,因此停止扩展该簇。
第10步,标记所有已经处理过的点。
第11步,检查是否还有未处理的点。如果有,则返回步骤3;否则,所有点都已处理完毕。
第12步,各个簇的生成过程如下:
- 簇1:{数据对象ID为1, 数据对象ID为2, 数据对象ID为4}
- 簇2:{数据对象ID为3, 数据对象ID为5, 数据对象ID为6, 数据对象ID为7, 数据对象ID为8, 数据对象ID为9}
- 簇3:{数据对象ID为10, 数据对象ID为11, 数据对象ID为12}
具体实现
1)打开weka,加载weather.numeric.arff,切换至Cluster标签页,选择SimpleKMeans算法,保持默认参数,生成2个簇,单击Ignore attributes按钮,选择play属性为忽略属性,单击start运行。
2)得到如下结果,最终的聚类结果以表格形式显示(如下图):行对应属性名,列对应簇中心。如果是数值型属性,则显示平均值,若是标称型属性,显示簇所在列对应的属性标签。
3)选中结果列表中的SimpleKmeans算法,右键,选择Visualize cluster assignment,弹出可视化窗口,点击❌,查看每个点的情况,思考聚类的准确性
可以发现,聚类效果
4)加载鸢尾花,切换到cluster,choose-weka-DBSCAN,设置DBSCAN的参数如下,半径为0.2,minPoint为5
5)同样忽略类别属性,单击ignore atrributes,,选择class属性,,单击start运行,得如下结果,簇0有49个实例,簇1有98个实例,还有三个实例未能聚类,根据原始样本,我们知道总共有三个类别,山鸢尾、变色鸢尾、维吉尼亚鸢尾,但现在聚类结果聚成了两个簇
6)故更改DBSCAN的参数,将minPoints设为2,再观察结果,会发现生成了三个簇(自行完成),但根据原始文本,每个类别有 50个样本,所以聚成的结果依然不准确,分析结果,思考有多少样本被分错了
7)更改DBSCAN的参数,将minPoints设为2,选中结果列表中的DBSCAN算法,右键,选择Visualize cluster assignment,弹出可视化如下窗口
8)点击可视化窗口中的某一个点(叉号会弹出具体这个点的信息,
要求解释这个点的含义
所学新知
K-Means算法的主要优点是其原理简单、实现容易,且具有快速的收敛的速度。能够得到较优的聚类效果,并且具有较强的可解释性。其主要需要调参的参数仅仅是簇数k。
相比DBSCAN聚类算法与K-Means相比具有一些优势。一方面,DBSCAN不需要输入要划分的聚类个数,而是根据数据的密度自动确定聚类个数。另一方面,DBSCAN对聚类簇的形状没有偏倚,可以处理不同大小和不同形状的簇。同时,DBSCAN还可以通过参数来控制噪声的过滤。
与K-means算法比较,显而易见的K-means很难处理非球形的簇和不同形状的簇。K-means可以发现不是明显分离的簇,即使簇有重叠也可以发现,但是DBSCAN会合并有重叠的簇。