聚类算法

时间:2019-03-11 15:08:32

标签: algorithm sas cluster-analysis

我在客户端群集方面遇到问题。

我有一个数据集,其中包含诸如nameaddressemailphone等列(例如A,{{1 }},B)。每行都有唯一的标识符(C)。我需要为每行分配IDCLUSTER_ID)。在一个群集中,所有行都具有与其他行相同的一个或多个属性。因此,具有X的客户端具有相同的ID=1,2,3属性,具有A的客户端具有相同的ID=3,10属性,则B应该位于同一群集中。

如何使用SQL解决此问题? 如果不可能怎么写算法(伪代码)? 性能非常重要,因为数据集包含数百万行。

样本输入:

ID=1,2,3,10

样本输出:

ID  A   B   C
1   A1  B3  C1
2   A1  B2  C5
3   A1  B10 C10
4   A2  B1  C5
5   A2  B8  C1
6   A3  B1  C4
7   A4  B6  C3
8   A4  B3  C5
9   A5  B7  C2
10  A6  B10 C3
11  A8  B5  C4

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

一种可能的方法是对空X重复更新。

从cluster_id 1开始。 F.e.通过使用变量。

SET @CurrentClusterID = 1

获取前1条记录,并将其X更新为1。

现在循环更新带有空X的所有记录, 并且可以链接到X = 1且具有相同的A或B或C的记录

免责声明:
  该声明将取决于RDBMS。
  这只是作为伪代码。

WHILE (<<some check to see if there were records updated>>) 
BEGIN
  UPDATE yourtable t
  SET t.X = @CurrentClusterID
  WHERE t.X IS NULL
    AND EXISTS (
      SELECT 1 FROM yourtable d 
      WHERE d.X =  @CurrentClusterID
        AND (d.A = t.A OR d.B = t.B OR d.C = t.C)
  );
END

循环直到更新0条记录。

现在对其他群集重复该方法,直到表中不再有空X。

  

1)将@CurrentClusterID增加1
   2)使用空X将下一个前1条记录更新为新的@CurrentClusterID
   3)循环更新,直到不再进行更新。

db <>提琴here 上针对MS Sql Server的示例测试。