当前位置: 首页>>技术问答>>正文


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

qingchuanTR 技术问答 , , , , 去评论

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

比方说,NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr

其中CategoricalAttr取三个可能值之一:CategoricalAttrValue1CategoricalAttrValue2CategoricalAttrValue3

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

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

最佳解决方法

由于各种原因,标准k-means算法不能直接应用于类别数据。类别数据的样本空间是离散的,并且没有自然来源。在这样的空间上的欧几里德距离函数并不是真正有意义的。正如有人所说的那样,“The fact a snake possesses neither wheels nor legs allows us to say nothing about the relative value of wheels and legs。” (来自here)

k-means的变种称为k-modes,由Zhexue Huang在this paper中引入,适用于分类(类别)数据。请注意,这个解决方案对初始条件很敏感,例如,如here(PDF)所述。

Huang的论文(上面链接)也有一个关于"k-prototypes"的部分,它适用于具有分类和数字特征的数据。它使用混合距离度量:分类特征的汉明距离和数字特征的欧几里德距离。

谷歌搜索“k-means混合分类数据”最近发表了很多关于k-means-like聚类的各种算法的论文,其中混合了类别和数值数据。 (我还没看过,所以我不能评论他们的优缺点:)。)


实际上,你建议的(将分类属性转换为二进制值,然后将k-means转换为数字值)是另一种尝试之前的方法(早于k-modes)。 (参见Ralambondrainy,H.1995。概念版的k-means算法。模式识别快报,16:1147-1157。)但我认为k-modes方法是优选的,原因如上所述。

次佳解决方法

在我看来,有一些解决方案来处理聚簇中的分类数据。 比如R语言中就为类别数据提供特定距离度量。这个距离叫做Gower(http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist),效果很好。

第三种解决方法

这里算是对上文的补充:

选择k-modes聚类绝对是保证聚类稳定性的好方法。

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

    data-mining,clustering,octave,k-means,categorical-data

  2. 关于混合(数字和分类)聚类,可能有用的好文章是:INCONCO: Interpretable Clustering of Numerical and Categorical Objects

  3. 超越k-means:由于普通k-means已经被排除在这个问题的适当方法之外,不同的度量,如信息论:Kullback-Liebler divergence(KL散度)在尝试将参数模型收敛到数据分布时效果很好。 (当然像GMM(高斯混合模型)这样的参数化聚类技术比Kmeans慢,所以有一些缺点需要考虑)

  4. 模糊k-modes聚类听起来也很吸引人,因为开发了模糊逻辑技术来处理分类数据之类的东西。有关更多信息,请参阅Fuzzy clustering of categorical data using fuzzy centroids

另请查看:ROCK: A Robust Clustering Algorithm for Categorical Attributes

第四种方法

这个问题似乎与表示有关,而不是聚类方法。

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

一种简单的方法是使用所谓的one-hot表示,它正是您认为应该做的。我们不是像"color"这样的变量可以采用三个值,而是将它分成三个变量。这些将是"color-red," "color-blue,"和"color-yellow,",它们只能取值1或0。

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

参考资料

本文由《纯净的天空》出品。文章地址: https://vimsky.com/article/3891.html,未经允许,请勿转载。