我有点二进制功能:
id, feature 1, feature 2, ....
1, 0, 1, 0, 1, ...
2, 1, 1, 0, 1, ...
并且矩阵的大小约为20k * 200k,但它很稀疏。我使用Mahout通过kmeans算法对数据进行聚类,并提出以下问题:
答案 0 :(得分:2)
您可以使用任何您喜欢的降维技术。我喜欢交替最小二乘; SVD效果也很好。对于这个大小矩阵,您可以使用Commons Math在内存中轻松完成,而不是使用Hadoop - 这有点过分。
(另请参阅http://myrrix.com - 我有一个非常快速的ALS实现,您可以在核心/在线模块中重复使用。它可以在数秒的堆中以几秒钟的速度处理。)
您的要素矩阵中不再有二进制0/1值。在特征空间中,余弦距离应该很好(1 - 余弦相似)。 Tanimoto / Jaccard不合适。
答案 1 :(得分:2)
此外,特别是对于您希望使用 k 的大型数据集?
你真的应该研究其他距离测量。您的数据量并不大;它应该仍然足以使用一台计算机。使用紧凑的矢量表示,它很容易适合主存储器。只是不要先使用计算n ^ 2相似度矩阵的东西。也许尝试用二进制矢量相似性的索引。
k-means相当容易实现,特别是如果你不进行任何提前播种。要减少内存使用量,只需自己实现它,以获得最适合您数据的表示形式。它可能是一个bitset,它可能是一个非零的维度排序列表。曼哈顿距离归结为计算向量不同的维数!