可理解的聚类

Posted

技术标签:

【中文标题】可理解的聚类【英文标题】:An understandable clusterization 【发布时间】:2012-08-22 17:07:35 【问题描述】:

我有一个数据集。该集合的每个元素都由数字和分类变量组成。分类变量是名义变量和有序变量。 这个数据集中有一些自然的结构。通常,专家使用他们的“专业知识”对我的数据集进行聚类,但我想自动化这个聚类过程。

大多数聚类算法使用对象之间的距离(欧几里得、Mahalanobdis 等)将它们分组到集群中。但是很难为混合数据类型找到一些合理的指标,即我们无法找到“玻璃”和“钢”之间的距离。所以我得出的结论是,我必须使用 条件概率 P(feature = 'something' | Class) 和一些依赖于它们的实用函数。这对于分类变量是合理的,并且假设它们是正态分布的,它适用于数值变量。

所以我很清楚像 K-means 这样的算法不会产生好的结果。

此时我尝试使用 COBWEB 算法,它完全符合我使用条件概率的想法。但我遇到了另一个障碍:集群化的结果真的很难解释,如果不是不可能的话。因此,我想得到一组描述每个集群的规则(例如if feature1 = 'a' and feature2 in [30, 60], it is cluster1),比如用于分类的决策树。

所以,我的问题是:

是否有任何现有的聚类算法适用于混合数据类型并产生可理解(并且对人类而言合理)的聚类描述。

其他信息:

据我了解,我的任务是在概念聚类领域。由于研究领域的原因,我无法像建议的那样定义相似函数(它是整个项目的最终目标) - 它在形式化方面非常复杂且无情。据我了解最合理的方法是COBWEB中使用的方法,但我不确定如何适应它,所以我可以得到一个难以理解的集群描述。

决策树

正如建议的那样,我尝试在聚类输出上训练决策树,从而将聚类描述为一组规则。但不幸的是,对这条规则的解释几乎和原始聚类输出一样难。首先,来自根节点的一些第一级规则确实有意义:更接近叶 - 我们拥有的意义较小。其次,这些规则不符合任何专业知识。

因此,我得出结论,聚类是一个黑箱,不值得尝试解释其结果。

还有

我有一个有趣的想法,以某种方式修改“回归决策树”算法:而不是计算组内方差,而是计算 category utility function 并将其用作拆分标准 .因此,我们应该有一个开箱即用的带有叶子集群和集群描述的决策树。但我没有尝试这样做,我不确定准确性和其他一切。

【问题讨论】:

为什么不能使用 class=cluster 的决策树?我假设您已经有了一些可以使用的标记示例... @amit 这就是我没有标记示例的关键,我也没有任何现有的类。理想情况下,我想实现以下目标:输入数据集 -> 聚类算法 -> 聚类描述,当专家查看描述时,他说:“是的,就是这样。我理解它,我也会这样做”。 您是否先验地知道类别的数量或类别的成员?如果没有距离度量,就真的没有一个好方法来确定你的算法有多好。 对不起,我不能给你比下面更多的提示。我相信训练决策树是最好的主意,因为决策树是真正为您提供决策过程解释的少数方法之一。 与 Anony-Mousse 的建议有关,random forests 可以在“无监督”模式下运行,从而导致聚类算法,并且由于它是基于树的,因此它回避了度量定义问题。跨度> 【参考方案1】:

对于大多数算法,您将需要定义相似度。它不需要是适当的距离函数(例如满足三角不等式)。

K-means 特别糟糕,因为它还需要计算 means。因此,如果您无法计算均值,或者使用与欧几里得不同的距离函数,最好远离它。

但是,请考虑定义一个距离函数来捕捉您的领域相似性知识。它可以由其他距离函数组成,比如您使用欧几里得距离的调和平均值(可能使用一些比例因子加权)和类别相似度函数。

一旦你有了一个不错的相似度函数,你就可以使用一大堆算法。例如DBSCAN (Wikipedia) 或 OPTICS (Wikipedia)。你可能对 ELKI 感兴趣,他们有一个Tutorial on writing custom distance functions。

解释是另外一回事。 不幸的是,很少有聚类算法会给你一个人类可读的解释他们的发现。它们可能会为您提供诸如代表之类的东西(例如,k-means 中集群的平均值),但仅此而已。当然,接下来您可以根据聚类输出训练决策树,并尝试解释从聚类中学习到的决策树。因为决策树的一个非常好的特性是它们在某种程度上是人类可以理解的。但是就像支持向量机不会给你解释一样,大多数(如果不是全部)聚类算法也不会这样做,对不起,除非你做这种后处理。此外,它实际上可以与 any 聚类算法一起使用,如果您想比较多种算法,这是一个很好的属性。

去年有一个相关的出版物。它有点晦涩和实验性(在 ECML-PKDD 的研讨会上),并且要求数据集以排名的形式具有相当广泛的基本事实。在示例中,他们使用了颜色相似度排名和一些标签。关键思想是分析集群并使用给定的基本事实找到最佳解释。他们试图用它来例如说“发现的这个集群很大程度上是基于这种特殊的绿色阴影,所以它不是很有趣,但是另一个集群不能很好地解释,你需要更仔细地调查它——也许算法发现了一些新的东西 em> 这里”。但这是非常实验性的(研讨会是针对正在进行的研究类型的)。您可能能够使用它,只需将您的特征用作基本事实。然后它应该检测如果一个集群可以很容易地用诸如“attribute5 is about. 0.4 with low variance”之类的东西来解释。但它不会强制创建这样的解释!

H.-P. Kriegel, E. Schubert, A. Zimek多重聚类解决方案的评估 在第二届 MultiClust 研讨会上:发现、总结和使用与 ECML PKDD 2011 一起举行的多个集群。http://dme.rwth-aachen.de/en/MultiClust2011

【讨论】:

请看问题的附加信息。 我猜你也可以用 COBWEB 做最底层的建议。集群,然后学习决策树以获得集群的描述。 如果您从聚类算法生成决策树 - 确保将每个叶子的最小实例数设置为 1,并且不进行修剪 - 这将确保生成的树与聚类算法一致。 感谢您的回复!当我有足够的时间时,我一定会尝试后一种方法,并会根据任何结果更新答案。【参考方案2】:

对于您描述的异构、非欧几里得数据向量,hierarchical clustering algorithms 通常效果最好。您描述的条件概率条件可以合并为用于执行集群聚集或划分的属性排序。生成的集群的语义很容易描述。

【讨论】:

【参考方案3】:

解决此类聚类问题的一种常用方法是定义一个统计模型,以捕获数据的相关特征。可以通过使用混合模型(如在高斯混合模型中)得出聚类分配,然后找到特定数据点的概率最高的混合分量。

在您的情况下,每个示例都是一个具有实数和分类分量的向量。一种简单的方法是分别对向量的每个分量进行建模。

我生成了一个小型示例数据集,其中每个示例都是二维向量。第一个维度是一个正态分布的变量,第二个维度是五个类别的选择(见图):

有许多框架可用于为统计模型运行蒙特卡罗推理。 BUGS 可能是最受欢迎的(http://www.mrc-bsu.cam.ac.uk/bugs/)。我在 Stan (http://mc-stan.org/) 中创建了这个模型,它使用与 BUG 不同的采样技术,并且对许多问题更有效:

data 
  int<lower=0>  N; //number of data points
  int<lower=0>  C; //number of categories

  real x[N]; // normally distributed component data
  int y[N];  // categorical component data

parameters 
  real<lower=0,upper=1> theta; // mixture probability
  real mu[2]; // means for the normal component
  simplex[C] phi[2]; // categorical distributions for the categorical component


transformed parameters 
  real log_theta;
  real log_one_minus_theta;
  vector[C] log_phi[2];
  vector[C] alpha;

  log_theta <- log(theta);
  log_one_minus_theta <- log(1.0 - theta);

  for( c in 1:C)
    alpha[c] <- .5;

  for( k in 1:2)
    for( c in 1:C)
        log_phi[k,c] <- log(phi[k,c]);

model 
  theta ~ uniform(0,1); // equivalently, ~ beta(1,1);
  for (k in 1:2)
    mu[k] ~ normal(0,10);
    phi[k] ~ dirichlet(alpha);
  

  for (n in 1:N) 
    lp__ <- lp__ + log_sum_exp(log_theta + normal_log(x[n],mu[1],1) + log_phi[1,y[n]],
                               log_one_minus_theta + normal_log(x[n],mu[2],1) + log_phi[2,y[n]]);
  

我编译并运行了 Stan 模型,并使用来自最终样本的参数来计算每个混合成分下每个数据点的概率。然后,我将每个数据点分配给混合组件(集群),以恢复以下集群分配的概率更高:

基本上,如果您创建了适合您的数据集的模型,每个混合成分的参数将为您提供每个集群的核心特征。

【讨论】:

这里的主要问题不是数据集的聚类,而是给定聚类的可接受的解释。当然,聚类算法可以彻底改变聚类结构,突然间这种结构变得简单明了。但这太好了,不能成为事实。我没有使用 BUGS 或 Stan,但如果我理解正确的话,它们使用的是高斯混合模型,因此其工作结果类似于 EM 算法产生的一种。是这样吗? 您可以从每个混合成分的分布中提取每个集群的解释。在 GMM 中,每个混合都是(多变量)高斯分布,可以用均值向量和协方差矩阵来描述。这种描述对于具有分类成分的数据可能并不理想。因此,您可能希望在混合分量上定义自定义分布来执行此操作 - 而不是高斯混合。 BUGS 和 Stan 可以为自定义混合物自动执行此推理过程,因此您不必自己推导出 EM 或采样更新。

以上是关于可理解的聚类的主要内容,如果未能解决你的问题,请参考以下文章

基于密度的聚类方法 Density-based clustering

如何使用 KMeans 在 RED、GREEN 和 BLUE 通道上进行主色提取的聚类

学习聚类算法总结

到底什么是谱聚类算法?

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

K 表示使用 Mahout 进行聚类