使用PyClustering对OPTICS进行聚类的详细指南

763 阅读7分钟

自动分类技术,也被称为聚类,有助于揭示数据集的结构。PyClustering是一个Python和C++的开源数据挖掘包,提供各种聚类技术和方法,包括生物启发的振荡网络。PyClustering主要关注聚类分析,使其更容易被用户接受和了解。本文将介绍pyclustering提供的不同类型的模块,并实现pyclustering支持的一种算法。以下是要介绍的主题。

内容列表

  1. 关于PyClustering
  2. PyClustering中的模块
  3. 关于OPTICS
  4. 如何使用Pyclustering实现OPTICS?

让我们先来谈谈PyClustering这个包吧

关于PyClustering

PyClustering库是一个用于Python和C++的数据挖掘包,专注于聚类分析。为了确保最佳效率,该库的C++部分被默认用于处理。这对于基于振荡网络的算法来说尤其如此,这些算法的动态是由一组微分方程调节的。如果没有找到C++编译器,PyClustering默认为所有内核的纯Python实现。PyClustering使用NumPy模块进行数组操作,以提高Python实现的速度。

PyClustering提供了高效、并行的C++14聚类解决方案。在大多数平台上,线程是通过单线程操作给出的,在Windows上利用了并行模式库。由于这些线程库的标准化,PyClustering可以直接实现在现有项目中。

PyClustering的主要Python要求是NumPy和SciPy,可视化功能需要MatPlotLib和Pillow。可视化功能包括集群嵌入的二维和三维图,图片段,以及振荡网络情况下的同步过程图。

Pyclustering中的模块

pyclustering中有五个模块,分别是聚类、n-net、g-colour和容器。

聚类算法

算法和方法都位于Python模块 "pyclustering.cluster "中。这里有一个Pyclustering支持的聚类算法的列表。

  • 聚合式
  • BANG
  • BIRCH
  • 矩阵
  • CLARANS
  • CLIQUE
  • CURE
  • DBSCAN
  • 肘部
  • EMA
  • GA - 遗传算法
  • 遗传算法 - HSyncNet
  • K-Means和K-Means++
  • K-Medians和K-Medoids
  • 遗传算法(MBSAS
  • OPTICS
  • 洛克
  • 侧影
  • SOM-SC
  • 同步网络和同步SOM
  • 视觉系统
  • X-Means

振荡网络和神经网络

振荡神经网络(ONN)和神经网络(NN)位于Python模块 "pyclustering.nnet "中。这里有一个Pyclustering支持的网络列表。

振荡神经网络(ONN)是一种人工神经网络,其中的神经元与振荡器相连。振荡神经网络的灵感来自于大脑中神经振荡的发生,与仓本模型密切相关。为了检测图片,震荡神经网络已经被开发出来:

  • 混沌神经网络(CNN)
  • 脉冲耦合神经网络(PCNN)
  • 自组织地图(SOM)
  • 基于仓本模型的振荡神经网络(Sync)
  • 用于模式识别的振荡神经网络(SyncPR)
  • 用于图像分割的振荡神经网络(SyncSegm)
  • 基于Landau-Stuart方程和仓本模型的振荡神经网络(fSync)
  • 基于Hodgkin-Huxley模型的振荡神经网络(HHN)
  • 滞后震荡网络
  • 局部兴奋性全球抑制性振荡网络(LEGION)

图形着色算法

图形着色算法位于Python模块 "pyclustering.gcolor "中。图形着色是图形标记的一个子集;它涉及到根据特定的标准给图形的节点分配标签。它是一种给图的顶点着色的方法,使得没有两个相邻的顶点是相同的颜色。有三种不同类型的技术被使用。

  • 饱和度
  • 滞后
  • GColorSync

容器

有两种类型的容器被Pycluster用来在n维空间建立一棵树,以搜索数据点进行聚类。在python中,它存在于一个 "pyclustering.container "中。

  • KD树
  • CF树

关于OPTICS

许多真实的数据集有一个关键的特征,即它们的潜在集群结构不能由全局密度参数来描述。为了识别数据空间中不同位置的聚类,可能需要非常不同的局部密度。一种基于密度的聚类方法是排序点识别聚类结构(OPTICS)。

基于密度的聚类的基本原则是,一定半径的邻域必须至少包含最小数量的对象(MinPts),也就是说,邻域的cardinality必须超过一个阈值。OPTICS生成一个数据库顺序,存储每个项目的核心距离和合理的可达性距离。

这是如何工作的?

OPTICS的工作原理与DBSCAN类似;它将首先检索从主循环OPTICS传递过来的对象的最大距离邻域,将其可达性-距离设置为未定义,并确定其核心距离。

然后检查该对象的核心对象属性,如果它不是生成距离的核心对象,则控制权简单地返回到主循环OPTICS,它选择数据库中下一个未处理的对象。否则,如果该项目是距离小于最大距离的核心对象,它将迭代收集关于最大距离和最小数量的直接密度可达对象。

从现在的核心对象中可直接密度到达的对象被添加到OrderSeeds种子列表中,用于未来的增长。OrderSeeds对象按照与最近的核心对象的可及性-距离排列,它们从该核心对象直接密度可及。

在每个周期中,选择种子列表中可达距离最短的当前对象。这个对象的最大距离邻域和核心距离被确定。然后,该项目连同其核心距离和当前可达距离一起被简单地保存。如果现有对象是一个核心对象,更多的扩展候选对象可以被添加到种子列表中。

OPTICS与DBSCAN有何不同?

  • OPTICS聚类方法需要消耗更多的内存,因为它使用优先级队列(Min Heap)来选择与目前正在处理的点最接近的下一个数据点的可达性距离。它还需要更多的计算机资源,因为DBSCAN中的最近的邻居查询比半径查询更复杂。
  • OPTICS聚类算法不需要epsilon参数,只是包含在上述伪代码中,以减少所需时间。因此,参数调整的分析过程被简化。
  • OPTICS不把输入数据划分为群组。它只是生成一个可达性距离图,由编码员来分析它并对点进行相应的分组。

如何使用Pyclustering实现OPTICS?

让我们安装Pyclustering来开始使用OPTICS算法:

! pip3 install pyclustering

导入必要的库

import random
from pyclustering.cluster import cluster_visualizer,cluster_visualizer_multidim
from pyclustering.cluster.optics import optics, ordering_analyser, ordering_visualizer
from pyclustering.utils import read_sample, timedcall
from pyclustering.samples.definitions import SIMPLE_SAMPLES,FCPS_SAMPLES,FAMOUS_SAMPLES

使用Pyclustering本身提供的样本数据,执行OPTICS算法对原始数据进行聚类并分析结果:

sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
radius_cluster = 0.2
num_neighbors = 10
optics_model = optics(sample, radius_cluster, num_neighbors)
optics_model.process()
clusters = optics_model.get_clusters()
noise = optics_model.get_noise()
ordering = optics_model.get_ordering()

定义聚类的半径和邻居的数量对算法是必要的。通过使用".get_clusters "来存储OPTICS算法所形成的聚类。同样,关于输入数据集的噪声和聚类排序的信息也被提取出来。数据集的聚类排序包含了按照连接半径的内部聚类结构的信息。

分析与样本形成的聚类。绘制形成的聚类数量的直方图,以检查每个聚类中的数据点的分布和扩散:

plots = cluster_visualizer()
plots.append_clusters(clusters, sample)
plots.show()
 
analyser_cluster = ordering_analyser(ordering)
ordering_visualizer.show_ordering_diagram(analyser_cluster, 2)

正如我们可以观察到的,聚类与样本大致相同。聚类也和样本一样保持着钻石的形状。如上所述,聚类的半径为0.2,在表示中,我们可以观察到聚类的半径大约为0.2。该算法共形成了2个聚类,从分布上看,可以说它们是完美形成的。

由于之前的数据是二维的,让我们在多维数据上实现这个算法。 除了可视化部分,代码中的一切都将是一样的。由于这是多维数据,我需要使用 "cluster_visualizer_multidim() "而不是 "cluster_visualizer()":

sample = read_sample(FAMOUS_SAMPLES.SAMPLE_IRIS)
radius_cluster = 0.5
num_neighbors = 10
optics_model = optics(sample, radius_cluster, num_neighbors)
optics_model.process()
clusters = optics_model.get_clusters()
noise = optics_model.get_noise()
ordering = optics_model.get_ordering()
 
plots = cluster_visualizer_multidim()
plots.append_clusters(clusters, sample)
plots.show()
 
analyser_cluster = ordering_analyser(ordering)
ordering_visualizer.show_ordering_diagram(analyser_cluster, 3)

在上面的表述中,有六个聚类图,代表数据的六个不同维度。我们也可以通过下面的代码将单个维度可视化。

plots = cluster_visualizer_multidim()
plots.append_clusters(clusters, sample)
plots.show(pair_filter=[[0,3]])

结论

PyClustering是一个数据挖掘包,它支持大量的聚类算法,使得它的操作非常灵活。由于它使用Numpy进行数学运算和并行处理,使得处理速度更快。通过这篇文章,我们了解了这个包和该包提供的模块,以及在二维和多维数据上实现OPTICS的情况。

参考资料