Mahout二进制数据聚类

时间:2012-07-11 08:01:58

标签: cluster-analysis binary-data mahout k-means dimension-reduction

我有点二进制功能:

id, feature 1, feature 2, ....
1, 0, 1, 0, 1, ...
2, 1, 1, 0, 1, ...

并且矩阵的大小约为20k * 200k,但它很稀疏。我使用Mahout通过kmeans算法对数据进行聚类,并提出以下问题:

  1. kmeans是二元功能的好选择吗?
  2. 在保持曼哈顿距离测量的概念(我需要曼哈顿而不是余弦或谷本)时,有没有办法减少尺寸
  3. kmeans的内存使用率很高,每个Map / Reduce Task需要4GB内存(4Mb块上400kb矢量文件,3k簇)。考虑到Mahout中的Vector对象使用双重条目,是否有任何方法可以仅使用布尔条目作为点,但是对于中心使用双重条目?

2 个答案:

答案 0 :(得分:2)

如果你有一个很好的距离指标,那么k-means是一个很好的选择。曼哈顿距离可能很好;我喜欢log-likelihood。

您可以使用任何您喜欢的降维技术。我喜欢交替最小二乘; SVD效果也很好。对于这个大小矩阵,您可以使用Commons Math在内存中轻松完成,而不是使用Hadoop - 这有点过分。

(另请参阅http://myrrix.com - 我有一个非常快速的ALS实现,您可以在核心/在线模块中重复使用。它可以在数秒的堆中以几秒钟的速度处理。)

您的要素矩阵中不再有二进制0/1值。在特征空间中,余弦距离应该很好(1 - 余弦相似)。 Tanimoto / Jaccard不合适。

答案 1 :(得分:2)

k-means有一个经常被忽视的大要求:它需要计算一个合理的平均值。这比人们想象的要重要得多。

  • 如果均值没有减少方差,它可能不会收敛 (算术平均值对于欧几里德距离是最佳的。对于曼哈顿,中位数据说更好。对于非常不同的指标,我不知道)
  • 平均值可能不会再稀疏了
  • 平均值不再是二元矢量,

此外,特别是对于您希望使用 k 的大型数据集?

你真的应该研究其他距离测量。您的数据量并不大;它应该仍然足以使用一台计算机。使用紧凑的矢量表示,它很容易适合主存储器。只是不要先使用计算n ^ 2相似度矩阵的东西。也许尝试用二进制矢量相似性的索引。

k-means相当容易实现,特别是如果你不进行任何提前播种。要减少内存使用量,只需自己实现它,以获得最适合您数据的表示形式。它可能是一个bitset,它可能是一个非零的维度排序列表。曼哈顿距离归结为计算向量不同的维数!