聚类树结构化数据

时间:2010-12-12 14:31:24

标签: algorithm language-agnostic artificial-intelligence cluster-analysis

假设我们以半结构化格式给出数据作为树。例如,树可以形成为有效的XML文档或有效的JSON文档。您可以想象它在Haskell或Ocaml中是类似lisp的S表达式或(G)代数数据类型。

我们在树结构中给出了大量的“文档”。我们的目标是聚类相似的文档。通过聚类,我们指的是一种将文档划分为 j 组的方法,使得每个组中的元素看起来彼此相似。

我确信那里有一些论文描述了方法,但由于我在AI / Clustering / MachineLearning领域并不为人所知,我想问一下谁在寻找什么以及在哪里挖掘。

我目前的做法是这样的:

  • 我想将每个文档转换为为K-means聚类设置的N维向量。
  • 为此,我递归地遍历文档树,并为每个级别计算一个向量。如果我在树顶点,我会重复所有的subvertices,然后求和它们的向量。此外,每当我重复时,都会应用一个功率因数,因此它越往下越然而越不重要。文档最终向量是树的根。
  • 根据树叶上的数据,我应用一个将数据转换为矢量的函数。

但可以肯定的是,有更好的方法。我的方法的一个弱点是它只会相似 - 聚类具有顶部结构的树木彼此非常相似。如果相似性存在,但发生在树的更远处,那么我的方法可能不会很好地工作。

我想在全文搜索中也有解决方案,但我确实想利用数据中存在的半结构。

距离函数

如建议的那样,需要在文档之间定义距离函数。如果没有此功能,我们就无法应用聚类算法。

实际上,问题可能在于该距离函数及其示例。我希望文档中根目录附近的元素相同,以便彼此靠近聚类。我们走的树越往下越重要。

采取一步退一步观点:

我想从程序中聚集堆栈跟踪。这些是格式良好的树结构,其中靠近根的函数是失败的内部函数。我需要在堆栈跟踪之间有一个合适的距离函数,这可能是因为代码中发生了相同的事件。

2 个答案:

答案 0 :(得分:2)

Here您可能会发现一篇与您的问题密切相关的论文。

摘自:

This thesis presents Ixor, a system which collects, stores, and analyzes stack traces in distributed Java systems. When combined with third-party clustering software and adaptive cluster filtering, unusual executions can be identified.

答案 1 :(得分:2)

鉴于您的问题(堆栈跟踪)的性质,我会将其减少为字符串匹配问题。将堆栈跟踪表示为树有点开销:对于堆栈跟踪中的每个元素,您只有一个父级。

如果字符串匹配确实更适合您的问题,您可以浏览数据,将每个节点映射到散列并为每个'文档'创建其n-gram。

示例:

映射:

  • 例外A - > 0
  • 例外B - > 1
  • 例外C - > 2
  • 例外D - > 3
文件A:0-1-2 Doc B:1-2-3

文件A <2> 2克: X0,01,12,2X

文件B <2> 2克: X1,12,23,3X

使用n-gram,无论根节点如何,您都可以聚类相似的事件序列(在此示例事件12中)

但是,如果您仍然确信需要树木而不是字符串,则必须考虑以下因素:找到树木的相似之处要复杂得多。您将需要找到类似的子树,其子树在更大的深度上相似,从而产生更好的相似性得分。为此,您需要发现封闭子树(子树是扩展它的树的基础子树)。您不想要的是包含非常少见的子树的数据集合,或者您正在处理的每个文档中都存在的子树(如果您不查找频繁的模式,则会获得这些子树)。

以下是一些提示:

一旦你有了频繁的子树,就可以像使用n-gram进行聚类一样使用它们。