用于混合数值和分类数据的K-Means聚类


133

我的数据集包含许多数字属性和一个类别。

NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr

其中CategoricalAttr采用的三个可能的值之一:CategoricalAttrValue1CategoricalAttrValue2CategoricalAttrValue3

我正在为Octave使用默认的k-means聚类算法实现https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/。它仅适用于数字数据。

所以我的问题是:将类别属性拆分CategoricalAttr为三个数字(二进制​​)变量是否正确IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3


7
是的,使用n个编码中的1个也是有效的。
肖恩·欧文

1
也许这种做法将是有益的:zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/...

您是否对分类和数字数据的“时间序列”聚类有任何想法?
Leila Yousefi '18

Answers:


122

由于种种原因,标准的k均值算法不适用于分类数据。分类数据的样本空间是离散的,并且没有自然起源。在这样的空间上的欧几里得距离函数实际上没有任何意义。有人说:“蛇既没有轮子也没有腿,这一事实使我们对轮子和腿的相对价值一无所知。” (从这里开始

黄哲学在本文中介绍了一种称为k模式的k均值变量,它适用于分类数据。请注意,您获得的解决方案对初始条件敏感,例如,此处讨论(PDF)。

Huang的论文(在上方链接)也有一个“ k-prototypes”部分,适用于具有分类和数字特征混合的数据。它使用一种距离度量,该距离度量将汉明距离用于分类特征,并将欧几里德距离用于数字特征。

Google搜索“分类数据的k均值混合”后,出现了许多关于分类k和均值数据混合的k均值聚类的各种算法的最新论文。(我尚未阅读它们,因此无法评论它们的优点。)


实际上,您提出的建议(将分类属性转换为二进制值,然后像对待数值一样进行k均值处理)是之前尝试过的另一种方法(在k模式之前进行)。(请参阅Ralambondrainy,H.,1995年。k-means算法的概念性版本。模式识别字母,16:1147-1157。)但由于我上面指出的原因,我相信首选k-modes方法。


10
如果将数字特征与二值化分类特征缩放到相同的范围,则余弦相似度往往会产生与上述汉明方法非常相似的结果。我没有一种可靠的方法来验证它在所有情况下均有效,因此,当我将cat和num数据混合在一起时,我总是使用我提到的简单余弦方法以及与Hamming混合使用的更复杂的方法来检查样本上的聚类。如果差异不大,我更喜欢简单的方法。
cwharland

1
@cwharland听起来很明智。在进一步考虑时,我还注意到,与Ralambondrainy相比,Huang给k-modes方法带来的优势之一-您不必为分类变量的每个值引入单独的功能-实际上,在在OP中,他只有一个带有三个值的类别变量。最好采用最简单有效的方法。
Tim Goodman 2014年

3
好答案。潜在的帮助:我已经在Python中实现了Huang的k模式和k原型(以及一些变体):github.com/nicodv/kmodes
Def_Os 2014年

2
我不建议将分类属性转换为数值。假设您有两个城市名称:NY和LA。如果应用纽约3号和洛杉矶8号,则距离为5,但是纽约和洛杉矶之间的差异看不到5。
adesantos

@adesantos是的,这是一个具有单个数字特征并使用欧几里得距离表示多个类别的问题。使用汉明距离是一种方法。在这种情况下,对于每个不同的要素(而不是分配给类别的数值之间的差),距离为1。使每个类别具有其自己的特征是另一种方法(例如,“是纽约”是0或1,而“是洛杉矶”是0或1)。
Tim Goodman 2014年

24

我认为,在聚类中有解决分类数据的解决方案。R带有用于分类数据的特定距离。该距离称为Gower(http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist),并且效果很好。


2
这是我用于混合数据集的方法-在应用于Gower距离矩阵的质体周围进行分区(请参阅r-bloggers.com/clustering-mixed-data-types-in-r)。问题在于,计算距离矩阵需要大量内存,与O(n ^ 2)成比例,因此对于大于10或20,000条记录的数据集,我正在研究k均值聚类的变体,这些变体需要较少的内存并且可以处理混合数据。
罗伯特·F

@RobertF同样在这里。不幸的是,对于大多数问题,可行的数据大小太低了。
储钱罐

20

(除了蒂姆·古德曼的出色回答)

选择k模式绝对是确保所使用的聚类算法稳定的方法。

  1. 聚类算法可以自由选择任何距离度量/相似性得分。欧几里得是最受欢迎的。但是可以使用根据每个维度/属性中的数据分布进行缩放的任何其他度量,例如Mahalanobis度量。 根据所使用的距离度量说明数据点到中心的距离。

  2. 关于混合(数字和分类)聚类,一个可能有帮助的好论文是:INCONCO:数字和分类对象的可解释聚类

  3. 超越k均值:由于已经排除了普通香草k均值作为解决此问题的合适方法,因此,我将尝试将聚类视为模型拟合问题的想法。各种不同的度量,例如信息理论度量:当试图将参数模型收敛到数据分布时,Kullback-Liebler散度效果很好。(当然,诸如GMM之类的参数聚类技术比Kmeans慢,因此要考虑缺点)

  4. 模糊k模式聚类也听起来很吸引人,因为开发了模糊逻辑技术来处理诸如分类数据之类的东西。有关更多信息,请参见使用模糊质心的分类数据模糊聚类

另请参阅:ROCK:分类属性的鲁棒聚类算法


17

这个问题似乎真的与表示有关,与聚类无关。

分类数据是机器学习中大多数算法的问题。例如,假设您有一个名为“ color”的类别变量,该变量可以采用红色,蓝色或黄色。如果我们分别简单地将这些数字分别编码为1,2和3,我们的算法将认为红色(1)实际上比蓝色(2)更接近黄色(3)。我们需要使用一种表示形式,使计算机理解这些东西实际上实际上是完全相同的。

一种简单的方法是使用所谓的“ 一站式”表示,这正是您认为应该执行的操作。与其像“颜色”这样的变量具有三个值,不如将其分成三个变量。它们分别是“红色”,“蓝色”和“黄色”,所有值只能取1或0。

这增加了空间的维数,但是现在您可以使用任何喜欢的聚类算法。在执行此过程之后,有时对zscore或变白的数据确实有意义,但是您的想法绝对是合理的。


我同意你的回答。HotEncoding非常有用。
Pramit

4

您也可以尝试“期望最大化”聚类算法。它可以处理分类数据,并会为您提供一个统计数据,说明群集最有可能采用哪种分类值。


2
你可以说得更详细点吗?EM是指可用于聚类的优化算法。有很多方法可以做到这一点,但您的意思并不明显。
拜耳2014年

@bayer,我认为这里提到的聚类是高斯混合模型。GMM通常使用EM。
goh 2014年

1
我认为这不是他的意思,因为GMM不采用分类变量。
拜耳2014年

3

这取决于您使用的类别变量。对于序数变量,比如说坏,平均和好,仅使用一个变量并具有值0、1、2和距离就有意义(平均接近差和好)。但是,如果没有顺序,则理想情况下应使用如上所述的一种热编码。


3

您不应在包含混合数据类型的数据集上使用k-means聚类。而是,有许多聚类算法可以适当地处理混合数据类型。一些可能性包括:

1)基于分区的算法:k原型,压缩器
2)分层算法:ROCK,凝聚式单,平均和完全链接
3)基于密度的算法:HIERDENC,MULIC,CLIQUE
4)基于模型的算法:SVM聚类,自我-组织地图

如果您想了解更多关于这些算法的信息,徐瑞(Rui Xu)撰写的手稿“ Survey of Clustering Algorithms”将对聚类分析进行全面介绍。


2

K-Means的目标是减少集群内方差,并且由于它计算质心作为集群的均值,因此需要使用欧几里得距离才能正确收敛。因此,如果您想绝对使用K-Means,则需要确保您的数据能够很好地工作。

表示

K-Means通常是集群,通过确保同一集群中的实例彼此相似,尝试将数据划分为有意义的组。因此,您需要一种表示数据的好方法,以便可以轻松计算出有意义的相似性度量。

当类别彼此等距时,对类别变量使用单热编码是个好主意。例如,如果您具有浅蓝色,深蓝色和黄色,则使用单热编码可能无法获得最佳效果,因为深蓝色和浅蓝色可能彼此“接近”,而不是黄色。

如果类别值不是“等距的”并且可以排序,则还可以为类别指定一个数值。例如,孩子,少年,成人可能分别表示为0、1和2。这是有道理的,因为少年比成人更“接近”成为孩子。

K-类固醇

一种更通用的K-Means方法是K-Medoids。K-Medoids的工作方式与K-Means类似,但主要区别在于,每个群集的质心定义为减少群集内距离之和的点。强制执行此操作可以使用所需的任何距离度量,因此,您可以构建自己的自定义度量,该度量将考虑应该关闭或不关闭哪些类别。


1

如果我们考虑无法对分类变量进行热编码的情况,例如分类变量具有200多个类别。

在这种情况下,您可以使用包 clustMixType

它可以处理混合数据(数字和分类数据),您只需要输入数据,它就会自动分离分类和数字数据。

如果您发现任何问题(例如某些数字属于分类问题),则可以在相应字段上分别作为as.factor()/反之亦然as.numeric()并将其转换为因子并将该新数据输入算法。

计算lambda,以便在聚类时可以将其作为输入。

我们甚至可以得到WSS(平方和内),plot(肘形图)来找到最佳的簇数。

希望这个答案可以帮助您获得更有意义的结果。


1

上面的许多观点指出,k均值可以在分类和连续变量上实现,这是错误的,需要一小撮盐就可以得出结果。

如上文@Tim所述,计算既不具有刻度也不具有阶数的点之间的欧几里得距离是没有意义的。当您对分类变量进行一次热编码时,会生成一个0和1的稀疏矩阵。由于值的范围是固定的且介于0和1之间,因此需要使用与连续变量相同的方式对其进行归一化。Z分数用于查找点之间的距离。哪一个还是不完全正确。我将通过一个示例对此进行解释。由于类别是互斥的,相对于类别变量,两点之间的距离取两个值之一,即高或低,即,两个点属于同一类别,或者不是。由于这些极端值,该算法最终会在影响集群形成的过程中赋予连续变量更多的权重。通过查看哪些变量在起作用,可以通过简单的检查来验证这一点,您会惊讶地发现其中大多数都是类别变量。(找到最有影响力的变量的方法[1])

一个示例:考虑一个类别可变的国家。现在我们知道来自不同国家的观测值之间的距离(相异性)是相等的(假设没有其他相似性,例如邻国或同一大陆的国家)。但是与此相反,如果您在归一化一个热编码值之后计算观测值之间的距离,则它们将不一致(尽管差异很小),并且它们将采用高值或低值。

最终,可用于python的最佳选择是k-prototypes,它可以处理分类变量和连续变量。

[1]:在集群形成中找到最具影响力的变量:https//stackoverflow.com/a/53081779/8224401


0

混合模型可用于聚类由连续变量和分类变量组成的数据集。

您可以使用R包VarSelLCM(在CRAN上提供),该包在每个群集内通过高斯分布和序数/二元变量对连续变量进行建模。注意将数据存储在data.frame中,其中连续变量是“数字”,类别变量是“ factor”。

可以从以下网站获得教程:http : //varsellcm.r-forge.r-project.org/

此外,缺失值可以通过手头的模型进行管理。


0

我遇到了同样的问题,并试图解决这个问题(不知道存在k原型),我发现自己遇到的丰富文献源于完全不使用相同距离度量来测量变量的想法。此外,可能存在各种信息源,这可能意味着数据的结构或“视图”不同。每当您遇到诸如Twitter /网站等社交关系时,这都是一个自然的问题。

一种可能的解决方案是分别解决变量的每个子集(即数字和类别)。距离度量在数字刻度上的操作很容易理解。类别数据本身很容易理解:考虑使用二元观测向量:两个观测向量之间0/1的列联表包含有关这两个观测之间相似性的大量信息。关于二元向量的各种定制相似性度量,已有大量文献-多数是从列联表开始的。

给定两个距离/相似度矩阵,它们都描述相同的观察值,则可以在每个观察值/相似度矩阵上提取图(多视图图聚类)或提取具有多个边缘的单个图-每个节点(观测值)的边缘数量与另一个节点,因为存在信息矩阵(多边缘聚类)。为每个边缘分配相应的相似度/距离度量的权重。从这里开始:图聚类算法的Github列表及其论文。由于在单个观测值上有多个信息集,因此必须使用例如频谱分析或链接矩阵分解的后代将它们交织在一起。频谱分析是查找单个图的高度连通或加权重的部分的默认方法。通过对交织数据进行频谱嵌入,任何对数值数据的聚类算法都可以轻松实现。为了简单起见,文献的默认值是kmeans,但要先进得多-并不是因为存在限制性算法,在这种情况下可以互换使用。

我喜欢这种方法的优点和通用性,因为它很容易扩展到多个信息集而不是简单的dtypes,并且进一步尊重每个数据子集上的特定“度量”。这并不能减轻您使用各种距离和相似性指标对模型进行微调或缩放变量的麻烦(在我的分析中,我发现自己将数值变量缩放为比例缩放比例)

从可伸缩性角度考虑,主要存在两个问题:

  1. 本征问题近似(也存在丰富的算法文献)
  2. 距离矩阵估计(一个纯粹的组合问题,它迅速变得很大-我还没有找到解决这个问题的有效方法)

玩得开心!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.