我有具有二进制特征的点:
id, feature 1, feature 2, ....
1, 0, 1, 0, 1, ...
2, 1, 1, 0, 1, ...
矩阵的大小约为20k * 200k,但很稀疏。我正在使用 Mahout 通过 kmeans 算法对数据进行聚类,并有以下问题:
- kmeans 是二元特征的良好候选者吗?
- 有没有办法在保持曼哈顿距离度量概念的同时减少维度(我需要曼哈顿而不是 Cosine 或 Tanimoto)
- kmeans 的内存使用率很高,每个 Map/Reduce 任务需要 4GB 内存(3k 集群的 400Mb 向量文件上有 4Mb block )。考虑到 Mahout 中的 Vector 对象使用双项,有没有办法只对点使用 bool 项,而对中心使用双项?
最佳答案
如果您有良好的距离度量,k-means 是一个不错的选择。曼哈顿距离还可以;我喜欢对数似然。
您可以使用任何您喜欢的降维技术。我喜欢交替最小二乘法; SVD 也运行良好。对于这个大小的矩阵,您可以使用 Commons Math 在内存中轻松完成,而不必费心使用 Hadoop —— 这太过分了。
(另请参见http://myrrix.com——我有一个非常快的ALS实现,您可以在核心/在线模块中重用。它可以在几秒钟内将其处理成数十MB的堆。)
特征矩阵中不再有二进制 0/1 值。在特征空间中,余弦距离应该效果很好(1 - 余弦相似度)。谷本/杰卡德不合适。
关于cluster-analysis - Mahout 二进制数据聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428156/