是否有任何聚类算法可以找到最长的连续子序列?

数据挖掘 机器学习 Python 聚类 k-均值 数据库扫描
2022-02-21 23:06:35

我有包含某些项目的访问持续时间的数据。

示例:
t0~t5 为访问时长,1 表示该时长内访问过,0 表示未访问过。

ID,t0,t1,t2,t3,t4
0,0,0,1,1,1
1,0,1,1,1,1
2,0,1,1,0,0
3,1,1,0,0,1
4,1,1,0,0,1

在上面的例子中,组ID=0,1是我想要的。

ID=3,4不是因为它们的距离很短,而是它们不是连续的。

我试过了KMeansDBSCAN它们都聚集ID=3,4成一个组,这是有道理的。但它没有做我想要的。

是否有任何可能的数据预处理来达到我想要的?

或者我应该使用其他分析工具?

2个回答

可能有帮助的是自定义距离计算作为聚类算法的输入。这些算法通常将欧几里得距离作为相异性的度量。

您可以尝试使用 metric='precomputed' 和 'X' 作为自定义距离矩阵的DBSCAN (在 Python scikit-learn 中)。您可以构建此距离矩阵以符合您的要求。例如:指定节点 3 和 4 的距离很大,即使它们相等。

转换数据可能是值得的,这样每条记录都是“连续的”(以不同的方式称呼它 - 例如“连续”,因为术语连续具有广为人知的数学含义),并在必要时制作多个副本。

K-means 最小化平方和。我看不出这有什么好处。

广义的DBSCAN。您可以为它定义任意邻居谓词。例如,您可以定义邻居(合并到同一集群的候选者)必须具有至少两个活动时间点的连续重叠。然后考虑这是否满足您的集群概念,因为 DBSCAN 计算了传递性。

我的猜测是,您宁愿例如提取所有记录的最小长度的所有连续子序列(例如,2 个),然后简单地计算它们以识别最频繁的子序列如果您使用有效的位表示来实现这一点,那么它将非常快。