我正在尝试在Spark中实现的Collaborative Filtering算法,并且遇到了以下问题:
假设我使用以下数据训练模型:
u1|p1|3
u1|p2|3
u2|p1|2
u2|p2|3
现在,如果我使用以下数据进行测试:
u1|p1|1
u3|p1|2
u3|p2|3
我从未看到用户'u3'的任何评级,可能是因为该用户没有出现在训练数据中。这是因为冷启动问题吗?我的印象是这个问题只适用于新产品。在这种情况下,我预计会对'u3'进行预测,因为训练数据中的'u1'和'u2'具有与'u3'类似的评级信息。这是基于模型和基于内存的协同过滤之间的区别吗?
答案 0 :(得分:2)
我假设你在谈论ALS算法?
'u3'不是您的训练集对,因此您的模型对该用户一无所知。所有人都可以返回所有用户的平均评分。
查看Spark 1.3.0 Scala代码:MatrixFactorizationModel
返回的ALS.train()
尝试在调用predict()
时在功能向量中查找用户和产品。当我尝试预测未知用户的评分时,我得到NoSuchElementException
。它就是这样实现的。