摘要:在流式传输过程中下,作者提供了一种算法,这种方法对聚类查询有更快的响应速度,即该方法能更快的查找到聚类中心。算法提出了一种新颖的思想—“coreset cache”(核心集缓存),它按一定规则重用了核心集来回答最新的聚类查询。
针对的是查询数据集中的聚类中心
一、引言
很多时候,待分析的数据不是全都已经获得了,而是源源不断地到来,甚至可能没有尽头,这叫做流数据,而流式k-means聚类与传统k-means自然也就有了许多不同,首先,它就需要一种算法来保存足够的状态信息,在更多的数据到来时,能够增量地更新各个簇;其次,当提出新的查询时,算法需要返回当前所有数据的k个聚类中心。
-
过去的算法:已获得的数据流S被分为了多个块S1,S2,......每个块被压缩紧了一个核心集,多个核心集又被递归地合并成了高层次的coreset tree(核心集树)。
这种算法的效率与需要被合并的核心集数量成比例,因而,在核心集数量巨大时,查询时间也会变得很高。当查询到来时,内存中所有活动的核心集会被合并到一起,然后在这个合并的数据集中应用聚类算法比如k-means++,最后输出k个聚类中心。
-
论文的贡献:提出了三种算法CC、RCC、OnlineCC,这些算法的精髓就是coreset caching,它的工作原理是重用在以前的查询中计算过的coreset,以加速对当前查询的coreset的计算。即利用一种聚类数据结构来更好地存储流式数据,以使得在需要用到这些数据时,能提供低延时的响应。
当查询到达时,该算法不需要将当前内存中所有的coreset合并起来,只需要把最近那次查询的coreset(存储在coreset cache中)和那次查询之后到达的点的coresets合并起来。也就是合并coreset cache的核心集和增量窗口的核心集们。
(1)最简单的算法:CC(Cached Coreset Tree)
(2)递归地应用CC:RCC(Recursive Cached Coreset Tree)
(3)结合CC和顺序流的思想:OnlineCC 现有流聚类算法:Sequential k-means、BIRCH、CluStream、STREAMLS
二、Preliminaries and Notation
- k-meas聚类:把每个点x归到k个簇中去,w(x)权值函数实现的是把d维的点x映射为一个整数,以和欧氏距离做计算
- k-means++:不是随机选择种子点(seeds),而是通过一定的算法来选择初始种子点。
见https://www.cnblogs.com/shelocks/archive/2012/12/20/2826787.html -
k-means Coreset:coreset的变体,适合实现k-means算法。公式意为在容忍一定的错误率的情况下,在核心集上进行k-means计算可替代在原巨大的数据集P上的计算。
符号 coreset(k, ε, P) 表示k-means coreset。
三、 流聚类和核心集树
- 作者为了解释论文中的算法是怎么样实现的,特地描述了一个适用于各种流聚类算法的驱动算法,也介绍了过去的CT(Corset Tree)算法,从而用其来演示驱动算法是怎么工作的,即,怎么往驱动算法中套入各种流聚类算法。
-
Driver Algorithm(驱动算法)
驱动算法由一个聚类数据结构D的特定实现和到来的数据大小m初始化,这两种数据都存储在对象 H 中。算法把到来的数据点分成每组大小为m的batches,并将之插入聚类数据结构中。H 中存有额外信息,如 H.C 和 H.n ,前者表示当前的batch(最大可存m个数据点,超过则需要重新建一个H.C),后者表示目前为止所接受到的点的数量。
而论文中所提及的各种算法,如CT、CC、RCC、OnlineCC等都是对数据结构D的实现。
-
CT(r路合并核心集树)
(1)CT是核心集树,由于没用到缓存,所以每次合并Coreset的时候,需要从内存中搜索全部coreset,极其耗时。
(2) 桶(bucket):用来存储数据流中的数据点(对象),有一个参数m,表示每个桶至多能存储m个数据对象。coreset是我们定义的数据结构,而对应到存储层面,用桶来表示它,也就是说,每个桶中的数据对象,可求得一个核心集。核心集树在多层维护桶,所以桶是分级的。
① level = 0的桶称为基桶(base bucket),新到达的数据都是存储在基桶中的;
② 一旦基桶的数据已=m,则新建一个基桶,并比较该层的基桶数目是否已经 > r,若是,则需要将基桶合并,得到 level = 1的桶;
③ level = l的桶由r^l个基桶的信息合并而来。当level = 3,r = 2 时,表示该层的bucket由23 = 8个基桶的信息合并而来(合并桶的方法是求coreset),即统计了8个基桶中的数据 ==> 即8*m个数据点的总结 ==> 即该桶对应的coreset总结了数据流中8*m个数据点的信息。
四、三个快速的流聚类算法
- CC(Coreset Tree with Caching)
使用了coreset caching来加速查询过程,方法是重用之前的查询中已经构建好的核心集。
coreset cache 中存有旧核心集的子集。
-
当需要回答新的查询时,CC避免了从CT多层次合并核心集的开销,而是只需要检索核心集树中的一小部分额外的核心集即可。
细节:
(1)每个缓存的核心集都是基桶1~基桶u的summary,u表示核心集的右端点,区间[1,u]则称作桶的“span”。
(2)哪些核心集会被缓存呢?
①. 整数分解。将n个batches到来后,将n进行如图所示的整数分解,其中,αi是递增的,即将n表示为以r为底的递增次幂的项之和
② 将公式的第一项,即i=0时的值赋给变量minor(n,r),剩下的值赋给变量major(n,r) , 即 major(n,r) = n - minor(n,r)
③ 又有n_k_如下图,相当于是把分解后的n的最小的k项删除后得到 n_k_,即n分解后的后面 j-k 项
④ 变量 prefixsum(n,r)表示所有 n_k_ 的集合,如图,则prefixsum(n,r)由 n_1,n_2,......,n_j 组成- 可知一定有 major(n,r) ∈ prefixsum(n,r) !!!!!!
例如, n = 47 ,r = 3. 则47 =1·33+2·32+2·30,于是有 minor(47, 3) = 2, major(47, 3) = 45,而 prefixsum(47, 3) = {27, 45}.
⑤ 若某个 coreset 的右端点 u ∈ prefixsum(n,r) 中,则CC缓存这个coreset。
(3)当查询来临,此时已收到N个batch,则CC的任务就是计算一个coreset,其 span=[1,N]。
①. CC会首先令 N1 = major(N,r) ,然后将 [1, N] 划分为 [1, N1]∪[N1+1, N] , 因为 major(N,r) ∈ prefixsum(N,r),所以[1, N1]一定已经在cache中了,因而此后只需要去核心集树中检索[N1+1, N]即可。
② . CC的工作算法如图,表示的是当Batch N到达之后,CT 和 CC 各自是什么样子,以及若是此时有新查询到来,CT算法和CC算法各会合并哪些coreset。以N=4和N=7为例。
(1). 当 N = 4 时,有4 = 0·20 + 0·21 + 1·22 ==> premixsum = {n_2} = {4} ==> 只有[ 1,4 ]在cache中(以前旧的coreset需要被清除掉)==> 回应查询时直接回[1,4]即可
(2). 当 N = 7 时, 有7 = 1·20 + 1·21 + 1·2^2 ==> premixsum = {n_1, n_2} = {6, 4} ==> [1,4] 和 [1, 6]在cache中(旧的coreset [1,4]不用被清除掉) ==> 回应查询时,需要合并 [1, 6] 和 [7, 7]
- RCC: Recursive Coreset Cache
- CC存在问题,层次太多,时间开销仍会增加。
- 用递归的方式来实现核心集缓存的思想,使得coreset的层次少一点,同时运行时间小。
- 在CT的单层中也使用CC的思想,则在查询的时候,甚至不用再合并r个coreset。
- 提高合并coreset的合并度,从而减少层数;而每层都有许多个未合并的coreset,因此为他们又单独递归地建立了CT和CC。
实现:
(1) 数据结构RCC的定义:每个RCC(i)由以下几部分组成
① cache(i),
② RCC(i)的每一层又由两个数据结构组成,其一是一个列表List_l,表示 l 这一层的桶集;其二就是RCC_l, 存储的是RCC(i-1)第 l 层信息。
- Online Coreset Cache: a Hybrid of CC and Sequential k-means
- 流聚类由两个组件构成,其一是构建的coreset以减小数据量,其二是聚类算法。CC和RCC都在讨论怎样通过减少查询时需要合并的coreset数量来减少第一个组件的运行时间。
- 就流聚类问题而言,CC和RCC都还需要支付聚类的时间开销,因而需要减少这部分的运行时间。
- OnlineCC 大多数情况下运行一个更简单的算法(计算开销仅O(1))来实现聚类以回答查询,只偶尔运行 k-means++。
- OnlineCC 结合了CC和在线k-means算法,在保证聚类质量的前提下更快地找出聚类中心。前者由CC保证,后者由在线k-means算法保证。
- 维护了一个评估系统,以适时地回到k-means++算法。
实现:
(1) 当数据到来时,算法会将数据点存入coreset,并直接利用在线k-means更新聚类中心,因而在查询的时候可以在O(1)的时间内回答出聚类中心;
(2) cost0表示CC+普通k-means++的聚类花销,EstCost表示对当前聚类中心集C进行更新所需聚类花销的评估,alpha > 1表示其评估系数。
(3) 当查询来临,若此时的EstCost比alpha·cost0还高,则算法回退至CC+普通k-means++,需要重新计算coreset,然后实现组件一和组件二。否则直接回答当前的聚类中心集C即可。