文章目录
- python 实现网格聚类算法
- 一、基于网格聚类原理
- 二、算法实现
- 1. CLIQUE 算法
- 参考资料
python 实现网格聚类算法
一、基于网格聚类原理
-
基本思想:
基于网络的方法:这类方法的原理就是将数据空间划分为网格单元,将数据对象集映射到网格单元中,并计算每个单元的密度。根据预设的 密度阈值 判断每个网格单元是否为 高密度单元,由邻近的稠密单元组形成 “类”(簇)。 -
算法过程:
算法的核心步骤:- 划分网格
- 使用网格单元内数据的统计信息对数据进行压缩表达
- 基于这些统计信息判断高密度网格单元
- 最后将相连的高密度网格单元识别为簇
-
主要算法:
- STING:基于网格多分辨率,将空间划分为方形单元,对应不同分辨率
- CLIQUE:结合网格和密度聚类的思想,子空间聚类处理大规模高维度数据
- WaveCluster:用小波分析使簇的边界变得更加清晰
二、算法实现
本渣渣在 github 上面找到了 python 的 pyclustering 模块,里面提供了绝大多数聚类算法的实现,比起 sklearn 的算法要全面一点,详细文档在:https://codedocs.xyz/annoviko/pyclustering/namespacepyclustering_1_1cluster_1_1clique.html
本人主要来进行 API 调用攻城狮的简单说明:
1. CLIQUE 算法
因为 CLIQUE 算法涉及对聚类的数据进行划分网格单元,为了让大伙看到直观效果,如下解释性代码部分暂时先不对数据进行标准化的预处理工作等。
- 导入需要的模块:
1 2 3 4 5 6 | import numpy as np # 选择聚类方法:clique 类 from pyclustering.cluster.clique import clique # clique 可视化 from pyclustering.cluster.clique import clique_visualizer |
- 构建待聚类的数据:
1 2 3 4 5 6 7 8 | # 1. 构建训练数据 f1 = np.array([37, 42, 49, 56, 61, 65]) # 体重 f2 = np.array([147, 154, 161, 165, 172, 177]) # 身高 data = np.array([f1, f2]) data = data.T data_M = np.array(data) |
- 使用 clique 聚类方法进行聚类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 创建 CLIQUE 算法进行处理 # 定义每个维度中网格单元的数量 intervals = 5 # 离群点的个数设置,为 0 的话把每一点都看作非离群值 threshold = 0 clique_instance = clique(data_M, intervals, threshold) # 开始聚类过程并获得结果 clique_instance.process() clique_cluster = clique_instance.get_clusters() # allocated clusters # 被认为是异常值的点(噪点) noise = clique_instance.get_noise() # CLIQUE形成的网格单元 cells = clique_instance.get_cells() print("Amount of clusters:", len(clique_cluster)) print(clique_cluster) |
- 聚类结果可视化:
1 2 3 4 | # 显示由算法形成的网格 clique_visualizer.show_grid(cells, data_M) # 显示聚类结果 clique_visualizer.show_clusters(data_M, clique_cluster, noise) # show clustering results |
运行结果:
- 网格单元图:
我们在算法 intervals = 5,对每一维的数据划分成5个网格单元,可以看见上图 x0 对应于数据集中的 f1特征,x1对应对数据集中的 f2特征。原始的二维数据便被划分成了 25(5 * 5)个网格单元,然后判断每个网格是否为高密度单元,最后将相连的高密度网格单元识别为簇。
如果数据集是多维,超过2维,CLIQUE是从随机组合两维生成网格单元,如图,数据集为3维,网格单元划分x0-x1、x0-x2、x1-x2:
- 聚类结果的散点图:
参考资料
-
算法原理:
https://segmentfault.com/p/1210000009787953/read -
pyclustering聚类包源码:
https://github.com/annoviko/pyclustering -
pyclustering聚类包帮助文档:
https://codedocs.xyz/annoviko/pyclustering/classpyclustering_1_1cluster_1_1clique_1_1clique.html