使用 SVD 的基于项目的推荐器

数据挖掘 推荐系统 apache-mahout
2021-09-18 04:32:50

我有一个项目-项目相似度矩阵。例如(矩阵是对称的,而且更大):

1.00 0.88 0.96 0.99 
0.88 1.00 0.99 0.96 
0.96 0.99 1.00 0.86 
0.99 0.96 0.86 1.00 

我需要实现推荐器,它为一组项目推荐一组新的项目。

我正在考虑使用SVD将项目减少到n维空间,比如说50维空间,所以每个项目都用一个50个数字的向量表示,两个项目之间的相似度是通过两个50维向量之间的余弦相似度计算的.

对于一组基本项目(可能会变得很大),我希望我可以计算它们向量的平均值,并将其用于搜索。

这是一个好主意吗?这个过程叫什么?可以在 Mahout 中完成吗?


编辑:

到目前为止,这是我的代码:

ItemSimilarity similarity = new LogLikelihoodSimilarity(model);
Matrix m = new DenseMatrix(NUM_ITEMS, NUM_ITEMS);
// copy similarities to a matrix
for (int i = 0; i < NUM_ITEMS; i++) {
        double[] similar = similarity.itemSimilarities(i, range(NUM_ITEMS));
        for (int j = 0; j < NUM_ITEMS; j++) {
            m.setQuick(i, j, similar[j]);
    }
}
Matrix v = new SingularValueDecomposition(m).getV();
Matrix reduced = v.viewPart(0, NUM_ITEMS, 0, 50);

问题是,对于 NUM_ITEMS > 30,SVD 将永远存在。我不知道数据是否存在问题,或者我正在使用的 SVD 实现是否存在问题。矩阵 m 是对称的,这可能是个问题吗?我尝试用谷歌搜索“demean matrix mahout”但没有结果。我应该如何预处理它以使 SVD 更快地工作?将来我需要 NUM_ITEMS 大约为 20.000 - 40.000。这是 SVD 的合理尺寸吗?


编辑2:

问题是矩阵包含一些 NaN 值,这就是 SVD 花费无限时间的原因。将这些替换为 0.0 后,它适用于 1000 x 1000 矩阵。我的建议很有效。我仍然需要计算 20 倍以上的行和列的 SVD。如果有人知道计算(近似)20.000 x 20.000 密集矩阵的 SVD 的最简单方法是什么,可能是通过一些云并行服务(?),请告诉我。

PS。感谢帮助!

2个回答

我需要实现推荐器,它为一组项目推荐一组新的项目。

这是一个好主意吗?

您是否研究过关联规则挖掘如果您对其他程序持开放态度,这是我想到的第一个基于项目集的推荐人的程序。对于不熟悉的人来说,这是零售店确定“75%的顾客买了A,B也买了C”的简单方法。在这些算法中,Apriori 算法简单明了、易于实施,并且可以为您提供所需的东西。

现在您面临可扩展性问题。

你听说过随机投影吗?这是我的建议:

比方说小号是你的项目-项目关系矩阵,它的维度太大而无法分解,现在你可以乘一个更小的矩阵ü(随机生成)并得到R=小号ü. R也很小。

然后只做 SVDR, 如果ü 是可逆的,并且两者之间的差异(l2-范数或您喜欢的任何范数) R小号 很小,可能有帮助。

至于第二个问题:

南值

如果它很密集,请尝试完成矩阵(使用均值?)。