在运行 kmeans 之前,我是否需要删除相关/共线的变量?

机器算法验证 聚类 数据挖掘 k-均值 多重共线性 组成数据
2022-01-22 07:31:02

我正在运行 kmeans 来识别客户群。我有大约 100 个变量来识别集群。这些变量中的每一个都代表客户在某个类别上的支出百分比。所以,如果我有 100 个类别,我就有这 100 个变量,这样每个客户的这些变量的总和是 100%。现在,这些变量彼此之间具有很强的相关性。在运行 kmeans 之前,我是否需要删除其中的一些以消除共线性?

这是样本数据。实际上,我有 100 个变量和 1000 万客户。

Customer CatA CatB CatC   
1         10%  70%  20%   
2         15%  60%  25%
3个回答

不要丢弃任何变量,但要考虑使用 PCA。这就是为什么。

首先,正如 Anony-mousse 所指出的,k-means 不会受到共线性/相关性的严重影响。您不需要因此而丢弃信息。

其次,如果您以错误的方式删除变量,您将人为地将一些样本拉得更近。一个例子:

Customer CatA CatB CatC
1        1    0    0
2        0    1    0
3        0    0    1

(我删除了 % 符号,只是将值置于 0 和 1 之间,受到约束,因此它们的总和为 1。)

每个客户在其自然 3d 空间中的欧式距离为(10)2+(01)2+(00)2=2

现在假设你放弃了 CatC。

Customer CatA CatB 
1        1    0    
2        0    1    
3        0    0    

现在客户 1 和 2 之间的距离仍然是,但客户 1 和 3 以及客户 2 和 3 之间的距离只有 . 您人为地使客户 3 与 1 和 2 更相似,这是原始数据不支持的。2(10)2+(00)2=1

第三,共线性/相关性不是问题。你的维度是。100 个变量足够大,即使有 1000 万个数据点,我担心 k-means 可能会在数据中找到虚假模式并与之匹配。相反,考虑使用 PCA 将其压缩到更易于管理的维数——比如从 10 或 12 开始(可能更高,也可能更低——你必须查看每个组件的方差,然后玩转一点,找到正确的数字)。这样做会人为地将一些样本拉得更近,是的,但是这样做的方式应该保留数据中的大部分方差,并且会优先消除相关性。

~~~~~

编辑:

回复,下面关于 PCA 的评论。是的,它绝对有病态。但它非常快速和容易尝试,所以如果你想减少问题的维度,对我来说仍然是一个不错的选择。

尽管如此,我还是尝试快速将几组 100 维合成数据放入 k-means 算法中,看看他们想出了什么。虽然集群中心位置估计不是那么准确,但集群成员(即两个样本是否分配到同一个集群,这似乎是 OP 感兴趣的)比我想象的要好得多。所以我之前的直觉很可能是错误的——k-means 可以很好地处理原始数据。

如果变量高度相关,建议删除它们。

无论聚类算法或链接方法如何,您通常遵循的一件事是找到点之间的距离。保持高度相关的变量几乎会给它们更多,计算两点之间距离的权重加倍(由于所有变量都已标准化,效果通常会加倍)。

简而言之,如果它与任何其他变量具有高度相关性,则影响集群形成的变量强度会增加。

在 2d 或 3d 的玩具示例中,它不应该有太大的区别,它只是为您的数据增加了一些冗余:您的所有点都在一个奇数的 (d-1) 维超平面上。集群方式也是如此。而这个(d-1)维超平面中的距离是相同距离的线性倍数,所以它不会改变任何东西。

如果您人为地构建此类数据,例如通过做(x,y)(x,y,x+y)然后你会扭曲空间,并强调xy. 如果你对所有变量都这样做,那没关系;但是您可以通过这种方式轻松更改权重。这强调了标准化和加权变量是必不可少的这一已知事实如果您的数据中有相关性,这比以往任何时候都更加重要。

让我们看一个最简单的例子:重复变量。

如果您在数据集上运行 PCA,并复制一个变量,这实际上意味着在该变量上放置了重复的权重。PCA 基于这样一个假设,即每个方向的方差都同样重要——因此,在进行 PCA 之前,您确实应该仔细权衡变量(考虑相关性,还需要进行任何其他必要的预处理)。