使用分类和数值数据进行聚类

机器算法验证 r 聚类 Python
2022-03-15 19:29:54

我经常遇到既有分类数据又有数值数据的数据集。我认为这只是生活中的一个事实,其中数据并不都在一个类别中。我基本上是在尝试找到一些实用的方法或策略来解决这个问题。

在谷歌的许多书籍和初步搜索中,我倾向于得到某种 Kmeans 聚类和许多看起来像 phd 的论文。我认为这是一个常见问题,所以我想知道是否有人可以指导我一些实用的建议或方法,我可以在 R 或 Python 中进一步研究和实施?

我基本上迷路了,只是在寻找方向!

2个回答

基于距离的聚类算法可以处理分类数据

您只需选择一个适当的距离函数,例如将所需属性组合成一个距离的高尔距离。然后,您可以运行Hierarchical Clustering、DBSCAN、OPTICS 等等。

听起来不错,但这只是故事的一部分——您选择的距离函数会对您的结果产生巨大影响。

分类数据的结果可能永远不会“健全”

然而,聚类可能最终无法很好地处理此类数据。考虑来自维基百科的描述:

聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象彼此之间(在某种意义上)比与其他组(聚类)中的对象更相似(在某种意义上) .

所以对于聚类,你需要一个定性的相似性,所以算法知道什么时候对象比其他对象“更相似”。

这就是为什么许多算法使用某种形式的距离:更接近 = 更相似。这是一种非常直观的限定相似性的方法。

对于连续变量,正确标准化数据具有足够的挑战性。大多数人要么忽略数据规范化,要么规范化为[0;1]或标准化为μ=0,σ=1. 对于高维数据,人们有时也会做 PCA(但通常以一种荒谬的方式使用它,而不考虑这对他们的数据的影响)。连续变量的好处是它们可以非常“宽容”。如果你的缩放/加权有一点偏差,结果可能仍然很好同样,如果您的数据中有一个小错误,它只会对您的距离产生很小的影响。

不幸的是,这不会延续到离散、李克特或分类变量。使用的方法很多,例如单热编码(每个类别都成为自己的属性),二进制编码(第一个类别是 0,0;第二个是 0,1,第三个是 1,0,第四个是 1,1)有效地将您的数据映射到Rd空间,您可以在其中使用 k-means 等等。但这些方法非常脆弱。如果您只有二元类别,它们往往会起作用,除非它们的频率变化太大。但问题是你的辨别力很低您可能在距离 0 处有 0 个对象(这些将是重复的),然后暂时没有,然后在距离 2 处有数百个对象。但两者之间没有. 因此,无论您使用哪种算法,都必须一次合并所有这些对象,因为它们具有完全相同的相似性。在最坏的情况下,您的数据可能会因此从仅重复数据变为“一切皆为一个集群”。现在,如果您对每个属性设置不同的权重,这会稍微好一些(您仍然会有很多对象对仅在这个属性上有所不同,因此具有相同的距离)但是您如何选择属性的权重没有出现统计上合理的无监督方式。

因此,总而言之,我认为分类数据不会以通常定义的聚类方式进行聚类,因为离散性质产生的区分/相似性排序太少。它可能具有例如由 Apriori 检测到的频繁模式,但这是一个非常不同的定义。而如何将这两者结合起来并不明显。所以对于分类数据,我推荐频繁模式这些比“集群”更有意义。

查看 R 包ClusterOfVar它处理混合数据。

编辑:我想我应该提到 k-means 实际上并不是最好的聚类算法。它更喜欢密度均匀的球状星团,每个星团的大小大致相同。如果违反了这些,那么 K-means 可能不会表现良好。经常使用它是因为您可以使用不同的目标函数来应用于许多不同的情况,例如将 cos() 用于高维数据。

我没有任何使用 Python 进行集群的经验,但我听说我上面提到的 R 包非常好,并且包含了很好的算法。