实时聚类
聚类算法是非监督算法中非常典型的一类算法,经典的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):加入当前数据点后,所有分类对应的所有数据点。 |
- 聚类算法可以应用在无界流中。
参数说明
参数 |
是否必选 |
说明 |
---|---|---|
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 |