我有一个项目-项目相似性矩阵。例如(矩阵是对称的,而且要大得多):
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维向量之间的余弦相似度来计算的。
对于一个基本的项目集(可能会变得相当大),我希望我可以计算它们的向量的平均值,并使用它进行搜索。
这是个好主意吗这个程序叫什么?在马乌特能做到吗?
编辑:
到目前为止,这是我的代码:
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是对称的,这会是个问题吗?我尝试谷歌“降级矩阵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。谢谢你帮忙!
发布于 2015-02-08 03:29:06
我需要实现推荐,对于一组项目,推荐一组新的项目。这是个好主意吗
你查过关联规则挖掘了吗?如果你是开放的其他程序,这是第一次出现在我的脑海中的推荐人基于一组项目。对于那些不熟悉的人来说,这是一种简单的方法,让零售商店确定"75%的顾客购买了A,B也买了C“。在这些标志中,[医]阿尔戈是直截了当的,易于实现,并可能得到您所需的东西。
https://datascience.stackexchange.com/questions/5079
复制相似问题