ROCK聚类算法的实践指南

477 阅读5分钟

聚类是无监督主体学习的一部分,其主要任务是对数据点进行分组,使分组后的数据点具有相似性。基本的聚类算法程序包括一个基本概念,即确定数据点之间的距离,并将它们分成几组。最接近的点被分离成一个组。目前有各种算法只针对这些基本现象工作,或通过改进相同的现象。而大多数算法在处理数据上没有可用的分类值或数据完全散布在空间中的数据时非常出色。我们无法指定数据点属于哪个类别。在这里,如果数据有分类值,就需要对分类或布尔属性进行聚类,这可以由ROCK(a RObust Clustering using linKs)执行。

简介

正如我们所知,聚类对于将一大组数据隔离成不同的有意义的组是很有用的。该组的数据点具有相似的属性,或者在空间中绘制时彼此接近。其他算法使用各点之间的距离值来进行聚类。ROCK在将其合并为一个聚类时采用了链接。

例如,在一个市场篮子数据库中,我们收集客户的交易,并设定客户在一次交易中购买的不同物品。在这里,我们可以对顾客进行聚类,这样,行为相似的顾客可以被隔离到一个聚类中。让我们更深入地了解一下。一个群组包括那些已婚并经常购买婴儿用品或其他日常需要的产品的顾客。而在另一个集群中,可能由购买进口产品的富人群体组成。所以在这种情况下,我们首先要对客户进行分类。然后,我们可以对他们进行分类,根据不同的客户群体进行有针对性的营销。

在这里,上述市场篮子数据库包含了分类值的数据点,而不是数值的数据点。数据库中的交易可以被看作是具有布尔属性的记录,每个属性对应一个单一的项目。为了进一步使用,我们可以在交易中出现的情况下给一个项目以真值,在交易中没有出现的情况下给一个项目以假值。这只是分类值的一个例子,分类值不仅限于真和假。在数据集中可以有更多的类别。这类分类值的聚类是ROCK的主要重点。

什么是ROCK算法?

下面的图片描述了该算法的基本步骤:

在这个步骤中,我们可以看到在第一步中,它从空间中的数据中抽取随机样本,然后在第二步中,它按照程序寻找从数据集中随机收集的数据点之间的联系,通过采用这些联系,它做出聚类并将样本保存到磁盘中。

让我们对ROCK的聚类算法有一个概述。在数学上,ROCK的算法可以表示如下:

图片来源

算法接受从数据集中随机收集的S个样本和 K个集群 的数量作为输入,然后计算S个样本之间的联系。接下来,每个样本被分离在集群中,对于每个集群i,它为所有的集群建立一个本地堆,并保持该堆直到算法的执行,然后该堆包含每个集群(j),以使link[i,j]不为零。本地堆中的群集j是按递减顺序排列的。另外,该算法还维护着包含所有集群的全局堆Q,Q全局堆以递减的方式对每个局部堆进行排序,然后将局部堆所包含的集群共享到全局堆中,并将其局部堆中的可用集群按照其好坏度的递减顺序排列。

下面的函数可以表示链接的计算:

图片来源

在计算链接时,算法为每个数据样本计算一个邻居列表,使其成为邻居对,对于每个邻居对,数据样本产生并贡献一个链接。这个过程对每个样本都是重复的。然后在最后,所有成对的点的链接数都会被玷污。

在Python中实现ROCK

ROCK的实现可以通过使用pyclustering库来完成,这是一个用于数据挖掘任务的Python和C++库,如聚类算法、振荡网络、神经网络等。该库支持Linux、Windows和Mac OS操作系统。

要求:

SciPy, matplotlib, numpy, pillow libraries and python 3.6 or above. 注(我使用google colab来执行ROCK)

安装该库:

!pip install pyclustering

输出:

接下来的文章中,我将在合成数据和库本身提供的数据上使用pyclustering库的ROCK包。

导入库

from pyclustering.cluster import cluster_visualizer,cluster_visualizer_multidim
from pyclustering.cluster.rock import rock;
from pyclustering.utils import read_sample;
from random import random;

在上面的代码中,我调用了一个包cluster_visualizer来实现集群的可视化,并调用了rock包来实现聚类和其他的前提条件。

生成一维合成数据:

data = [ [random()] for i in range(10) ] + [ [random() + 3] for i in range(10) ] + [ [random() + 5] for i in range(10) ] + [ [random() + 8] for i in range(10) ]

data

输出:

拟合ROCK模块中的数据:

rock_instance = rock(data, 1, 4, 0.5);

rock_instance.process();

clusters = rock_instance.get_clusters();

这里我们告诉rock_instance模块产生四个数据聚类。

将聚类可视化:

visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, input_data)
visualizer.show();

输出:

在这里,我们可以看到ROCK模块已经将数据点分离成4个聚类。对于这个数据,它表现得很好。

接下来,我们将在软件包中提供的pyclustering库的三维数据中使用ROCK进行聚类。

读取数据:

from pyclustering.samples.definitions import FCPS_SAMPLES
from pyclustering.utils import read_sample

data = read_sample(FCPS_SAMPLES.SAMPLE_HEPTA)

在数据中拟合ROCK:

# Create an instance of the ROCK algorithm for cluster analysis. Seven clusters should be allocated.
rock = rock(data, 1.0, 7)

 # Run cluster analysis.
rock.process()

# Obtain results of clustering.
clusters = rock.get_clusters()

聚类的可视化

visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, data)
visualizer.show();

输出:

在这里我们可以看到,我们的聚类是按照指示准备的,生成了7个数据集的聚类。该模型在数据集上表现良好。我们已经看到它是多么容易实现一些基本要求。Pyclustering也是一个很好的库;他们在执行聚类算法的软件包中涵盖了大部分的算法。

参考文献