使用 SVD 进行聚类

数据挖掘 聚类
2021-10-08 18:04:19

我正在试验的数据集采用表格形式,其中包含 userid 和 itemid 列。如果给定用户和给定项目有一行,则表示用户访问了该项目(就像在在线商店中一样)。我正在尝试根据此数据对类似项目进行聚类。如果经常一起访问一对项目,则这些项目是相似的。

因为这是一个高维的情况(用户和项目的数量将在 10,000 中),我认为我有理由尝试使用 SVD 作为预聚类步骤,然后进行一些经典聚类。当我尝试这样做时,与简单的层次聚类相比,我得到的聚类结果很差。不太相似的项目在一个维度中被存储在一起,而有一些可用的维度没有被使用。结果不是完全随机的,但肯定比层次聚类的输出差。我尝试了 Mahaut 和 Octave 的 SVD 步骤,结果相似。对于层次聚类,我使用了 Jaccard 度量。

在这一点上,我开始怀疑 SVD 作为一种降低维度的方法的概念。您是否认为在这种情况下不能有效地使用 SVD(为什么?)或者您认为我在此过程中犯了一些错误?

1个回答

我们以与您几乎相同的方式使用奇异值分解,除了不是对相似的项目进行聚类,我们使用降秩矩阵来支持基于潜在语义索引中的术语文档矩阵的推荐引擎。

从您的简要描述来看,您的方法似乎足够合理。但是,我强烈推荐阅读Berry、Dumais 和 O'Brien 的 Using Linear Algebra for Intelligent Information Retrieval

使用 SVD 的关键是为原始稀疏矩阵选择可接受的 rank-k 近似值。您应该使用对角矩阵 Sigma 中的奇异值进行一些探索性分析,看看可以解释多少方差。这个问题是在 CrossValidated 上的这个问题中提出的

我读过的很多论文都建议在 200 到 300 个奇异值之间的任何地方 k 等级。在概念验证实现中,我们有大约 10000 行(唯一术语)到大约 1000 列(唯一文档)的原始稀疏矩阵,我们仅用 300 个奇异值捕获了略低于 85% 的方差。

但是,这实际上取决于您的数据的性质,因此您的里程可能会有所不同。