我有一个具有分类特征的数据集。我想使用聚类技术对数据进行分段。考虑到数据具有分类特征这一事实,这种情况下可能的选择是什么。是否有可以在这里使用的 k-means 的任何变体。
聚类分类数据
k-means 不是一个好的选择,因为它是为连续变量设计的。这是一个最小二乘问题定义 - 2.0 的偏差是 1.0 的偏差的 4 倍。
在二进制数据(例如 one-hot 编码的分类数据)上,平方偏差的概念不是很合适。特别是,簇质心不再是二元向量了!
您首先应该问的问题是:“什么是集群”。不要只希望算法有效。选择(或构建!)解决您的问题的算法,而不是其他人的!
在分类数据上,频繁项集通常是比 k-means 的质心概念更好的聚类概念。
没有足够的声誉发表评论...
您对您的分类变量是否表现出某种排序有任何见解吗?或者他们是名义上的?是否可以对变量进行排序以使其直观?
您的问题归结为选择适当的距离度量。或者更确切地说,是什么定义了你的“相似性”。您可能想探索一种称为 k-modes 的 k-means 算法变体。下面的最后一个链接提供了有关此分类聚类方法的更多信息。
在不了解您的数据的情况下,这些链接可能有用:
https://stats.stackexchange.com/questions/56479/cluster-analysis-on-ordinal-data-likert-scale
我真的看不出简单的 K-Means 聚类不应该起作用的原因。如果您将分类数据转换为整数(或编码为二进制,其中一列等于一个类别,即所谓的“单热编码”),则可以将其提取到算法中。
然后,您可以通过计算模式以查看差异来比较彼此之间的集群。
此外,正如 dmanuge 所提到的,使用不同的指标可能会有所帮助。但我会在简单的 K-Means 之后去做这个。
您的方法可能取决于您尝试包含在模型中的每个特征中的特征数量和类别数量。我使用虚拟变量将分类数据转换为数值数据,然后使用虚拟变量进行 K-means 聚类并取得了一些成功。
这是一个小例子:
+----+----+----+
| ID | F1 | F2 |
+----+----+----+
| 1 | a | x |
| 2 | d | w |
| 3 | f | x |
+----+----+----+
为每个特征的每个类别创建一个列。对于每条记录,只有在与初始特征值对应的虚拟变量字段中,虚拟变量字段的值为1。其余为0。
+----+------+------+------+------+------+
| ID | F1_a | F1_d | F1_f | F2_w | F2_x |
+----+------+------+------+------+------+
| 1 | 1 | 0 | 0 | 0 | 1 |
| 2 | 0 | 1 | 0 | 1 | 0 |
| 3 | 0 | 0 | 1 | 0 | 1 |
+----+------+------+------+------+------+
如果您在 Python 中使用 Pandas,pandas.get_dummies()可以为您生成虚拟变量。
有时,您可能有很多类别,因此尝试为每个类别创建一个虚拟变量是不合理的。对于我的问题,在我的模型中只包含最常出现的类别(例如前 15 个类别)的虚拟变量是可以接受的,但您必须决定这是否适合您的问题。