更新时间:2022-02-22 GMT+08:00

实时聚类

聚类算法是非监督算法中非常典型的一类算法,经典的K-Means算法通过提前确定类别数目,计算数据点之间的距离来分类。对于离线静态数据集,我们可以依赖领域中知识来确定类别数目,运行K-Means算法可以取得比较好的聚类效果。但是对于在线实时流数据,数据是在不断变化和演进,类别数目极有可能发生变化,DLI服务提供一种能够应对此类场景,无需提前设定聚类数目,并且低延时的在线聚类算法。

算法大致思想为:定义一种距离函数,两两数据点之间如果距离小于某个阈值,则他们属于同一个类别。若某数据点和多个类别中心点的距离都小于这个阈值,则多个类别会发生合并操作。当数据流中的数据到达,算法会分别计算与所有类别的距离,从而决定此数据作为一个新类别或者归属于某类别。

语法格式

1
2
3
4
CENTROID(ARRAY[field_names], distance_threshold):加入当前数据点后,该数据点所属分类中心。
CLUSTER_CENTROIDS(ARRAY[field_names], distance_threshold):加入当前数据点后,所有分类中心。
ALL_POINTS_OF_CLUSTER(ARRAY[field_names], distance_threshold):加入当前数据点后,该分类所有数据点。
ALL_CLUSTERS_POINTS(ARRAY[field_names], distance_threshold):加入当前数据点后,所有分类对应的所有数据点。
  • 聚类算法可以应用在无界流中。

参数说明

表1 参数说明

参数

是否必选

说明

field_names

数据在数据流中的字段名,多字段以逗号隔开。例如ARRAY[a, b, c]。

distance_threshold

距离阈值,当两数据点距离小于阈值时,它们将属于同一个类别。

示例

分别使用四种函数结合窗口来实时计算聚类的相关信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT 
  CENTROID(ARRAY[c,e], 1.0) OVER (ORDER BY proctime RANGE UNBOUNDED PRECEDING) AS centroid,
  CLUSTER_CENTROIDS(ARRAY[c,e], 1.0) OVER (ORDER BY proctime RANGE UNBOUNDED PRECEDING) AS centroids
FROM MyTable

SELECT 
  CENTROID(ARRAY[c,e], 1.0) OVER (ORDER BY proctime RANGE BETWEEN INTERVAL '60' MINUTE PRECEDING AND CURRENT ROW) AS centroidCE, 
  ALL_POINTS_OF_CLUSTER(ARRAY[c,e], 1.0) OVER (ORDER BY proctime RANGE BETWEEN INTERVAL '60' MINUTE PRECEDING AND CURRENT ROW) AS itemList,
  ALL_CLUSTERS_POINTS(ARRAY[c,e], 1.0) OVER (ORDER BY proctime RANGE  BETWEEN INTERVAL '60' MINUTE PRECEDING AND CURRENT ROW) AS listoflistofpoints
FROM MyTable