Mahout 二进制数据聚类

Posted

技术标签:

【中文标题】Mahout 二进制数据聚类【英文标题】:Mahout binary data clustering 【发布时间】:2012-07-10 19:20:03 【问题描述】:

我有二元特征点:

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

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

    kmeans 是二元特征的良好候选者吗? 有什么方法可以在保持曼哈顿距离度量的概念的同时减小尺寸(我需要曼哈顿而不是余弦或谷本) kmeans 的内存使用率很高,每个 Map/Reduce 任务需要 4GB 内存(4Mb Blocks on 400Mb vector file for 3k clusters)。考虑到 Mahout 中的 Vector 对象使用双重条目,有没有办法只使用布尔条目作为点,而对中心使用双重条目?

【问题讨论】:

【参考方案1】:

如果你有一个好的距离度量,k-means 是一个很好的候选者。曼哈顿距离可能很好;我喜欢对数似然。

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

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

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

【讨论】:

我不确定完全理解手头的问题,但在评估具有二进制属性的两个对象之间的相似性时,Jaccard 距离是合适的。【参考方案2】:

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

如果均值不降低方差,它可能不会收敛 (算术平均值对于欧几里得距离来说是最优的。对于曼哈顿,据说中位数更好。对于非常不同的指标,我不知道) 平均值可能不再那么稀疏了 平均值也不再是二元向量

此外,特别是对于大型数据集,您想使用哪个k

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

k-means 相当容易实现,尤其是在您不进行任何提前播种的情况下。为了减少内存使用,只需自己实现它以获得最适合您的数据的表示。它可以是一个位集,也可以是一个非零维度的排序列表。曼哈顿距离归结为计算向量不同的维数!

【讨论】:

正如你所说 centeriods 没有二进制值,所以我不能为它们保留二进制值。看来,如果我想以不同的方式处理质心和实际数据,我需要有自己的实现。此外,我无法访问具有数十 GB 内存的机器,因此 mahout 似乎是我的最佳选择,因为它可以表明该方法是可扩展的。我应该尝试 Median 方法,可能是通过更改 mahout 实现并查看结果。 是的。并看看 k 中位数。中值再次是二进制的,对于二进制数据来说计算起来很简单且便宜:它们是集群中最常见的值。但这也是一个风险:该值可能总是为 0!此时,您最终只进行了一些随机特征选择。所以抓住另一个算法,没有来自 k-means 系列。 @Anony-Mousse 虽然我不同意你反对 k-means 的论点,也暴露在另一个 stack exchange question 中,但我很好奇你的基础是什么,因为 k-means 得到了帮助在将 k-means 用于二进制流时,汉明距离和分量中位数是一种流行的选择,例如Matlab k-means 实现 k-medians 是一个已知的变体,它是稳定的,因为中值优化了绝对偏差。但是,对于稀疏的二进制数据,每个维度的中位数很可能为 0。并非所有使用、提供或流行的东西都是稳定的并且在数学上是有根据的。

以上是关于Mahout 二进制数据聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用存储为 CSV 的矢量数据在 mahout 中执行 k-means 聚类?

使用 Clojure 使用 Mahout 进行聚类 (fkmeans)

mahout kmeans 聚类:显示错误

使用 Mahout 对一个点进行聚类

K 表示使用 Mahout 进行聚类

数据挖掘---推荐算法(Mahout工具)