基于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,...,p~n~,p~1~=q,p~n~=p,对pi∈D,(1<=i<=n),p~i+1~是从p~i~关于ε和MitPts直接密度可达的,则对象p是从对象q关于ε和MinPts密度可达的。
例如,在图5-7中,ε=1cm,MinPts=5,q是一个核心对象,p1是从q关于ε和MitPts直接密度可达,p是从p~1~关于ε和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)
步骤:
第1步,在数据库中选择一点1,由于在以它为圆心的,以1为半径的圆内包含2个点(小于4),因此它不是核心点,选择下一个点。
第2步,在数据库中选择一点2,由于在以它为圆心的,以1为半径的圆内包含2个点,因此它不是核心点,选择下一个点。
第3步,在数据库中选择一点3,由于在以它为圆心的,以1为半径的圆内包含3个点,因此它不是核心点,选择下一个点。
第4步,在数据库中选择一点4,由于在以它为圆心的,以1为半径的圆内包含5个点,因此它是核心点,寻找从它出发可达的点(直接可达4个,间接可达2个),聚出的新类{1,3,4,5,9,10,12},选择下一个点。
第5步,在数据库中选择一点5,已经在簇1中,选择下一个点。
第6步,在数据库中选择一点6,由于在以它为圆心的,以1为半径的圆内包含3个点,因此它不是核心点,选择下一个点。
第7步,在数据库中选择一点7,由于在以它为圆心的,以1为半径的圆内包含5个点,因此它是核心点,寻找从它出发可达的点,聚出的新类{2,6,7,8,11},选择下一个点。
第8步,在数据库中选择一点8,已经在簇2中,选择下一个点。
第9步,在数据库中选择一点9,已经在簇1中,选择下一个点。
第10步,在数据库中选择一点10,已经在簇1中,选择下一个点。
第11步,在数据库中选择一点11,已经在簇2中,选择下一个点。
第12步,选择12点,已经在簇1中,由于这已经是最后一点所有点都以处理,程序 终止。
具体实现
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可以处理不同大小和不同形状的簇,K-means很难处理非球形的簇和不同形状的簇。K-means可以发现不是明显分离的簇,即便簇有重叠也可以发现,但是DBSCAN会合并有重叠的簇。