" R7 d7 l' t/ G* A3 d8 @: M) W0 k (1) 从一个层次开始 $ \- i! N q, N: t3 k5 C' \' w $ H% ^8 U2 z) f# A3 E# v n3 \ (2) 对于这一个层次的每个单元格,我们计算查询相关的属性值。) {6 X# o( u7 N
6 O# N9 {6 H: E1 F0 H4 p
(3) 从计算的属性值以及约束条件下,我们将每一个单元格标记成相关或者不想关。(不相关的单元格不再考虑,下一个较低层的处理就只检查剩余的相关单元)* {8 z* E. i; Z- W0 l
; w2 ?( `' P d3 v$ d7 J (4) 如果这一层是底层,那么转(6),否则转(5) 2 [3 m2 L' ~# g% J6 t4 v) J4 K$ Z: T) Y
(5) 我们由层次结构转到下一层,依照步骤2进行 ' n6 h0 b; G" O0 v; A8 U& Y1 W# {+ u
(6) 查询结果得到满足,转到步骤8,否则(7)* z; W% H5 z3 E) h- U6 W; x
( j; |- {' H: O+ t" r
(7) 恢复数据到相关的单元格进一步处理以得到满意的结果,转到步骤(8) 2 P' E& }. H5 t0 P9 M1 v- o+ Q9 |2 n" ?) K
(8) 停止0 g7 m4 p0 K& C3 Y/ k/ r2 Y! x# N4 T
: F+ g" H! U( @' A 到这儿,STING算法应该基本就差不多了,其核心思想就是:根据属性的相关统计信息进行划分网格,而且网格是分层次的,下一层是上一层的继续划分。在一个网格内的数据点即为一个簇。! W8 g: ^% h% ?+ o" F) }
/ O3 @& Y, d$ K2 ?% P1 M' n) |
同时,STING聚类算法有一个性质:如果粒度趋向于0(即朝向非常底层的数据),则聚类结果趋向于DBSCAN聚类结果。即使用计数count和大小信息,使用STING可以近似的识别稠密的簇。" _. o# F( r' N5 @
+ u Q& n E2 X. L! S7 X
STING算法的优点:2 l7 V$ \) t4 v5 v. o* E
: X9 P4 o- r0 P% W) y0 c
(1) 基于网格的计算是独立于查询的,因为存储在每个单元的统计信息提供了单元中数据汇总信息,不依赖于查询。' N0 g2 x5 P0 m2 q; i! o! x2 G0 Q3 b
: H+ h! f! }3 K, Z7 {; A! M
(2) 网格结构有利于增量更新和并行处理。 , ?6 ~) Q7 Y% U+ w/ n2 F$ u# Q2 L3 x; T" T* ?9 X+ |
(3) 效率高。STING扫描数据库一次开计算单元的统计信息,因此产生聚类的时间复杂度为O(n),在层次结构建立之后,查询处理时间为)O(g),其中g为最底层网格单元的数目,通常远远小于n。 0 r5 z5 ^ y \8 E 1 ?9 o4 N8 I$ p- d# \ 缺点:; K$ f2 w( ~) f# E( [
( k! k% \' M1 K
(1) 由于STING采用了一种多分辨率的方法来进行聚类分析,因此STING的聚类质量取决于网格结构的最底层的粒度。如果最底层的粒度很细,则处理的代价会显著增加。然而如果粒度太粗,聚类质量难以得到保证。 ) A7 U' W7 q" m/ |# [2 Q/ O. _% Y! J1 s- L1 z/ T9 f, z
(2) STING在构建一个父亲单元时没有考虑到子女单元和其他相邻单元之间的联系。所有的簇边界不是水平的,就是竖直的,没有斜的分界线。降低了聚类质量。2 A. H9 z D3 K' @