我有一个项目-项目相似度矩阵。例如(矩阵是对称的,而且更大):
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。感谢帮助!