我有以下表格中有关特定项目用户偏好的数据:
user, item, preference
1, 75, 0.89
2, 168, 0.478
2, 99, 0.321
3, 31, 0.012
对于每个用户,我需要根据他们的偏好使前N名最相似的用户。系统有成千上万的用户和项目。建议将在批处理过程中生成,并在Elasticsearch上提供。
在Mahout中,可以执行此操作的简单算法如下所示:
val similarity:UserSimilarity=new PearsonCorrelationSimilarity(dataModel)
val neighborhood:UserNeighborhood = new ThresholdUserNeighborhood(0.75, similarity, dataModel)
val userBasedRecommender:UserBasedRecommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
val userid=1
val howMany=10
val mostSimilarUserIDs = userBasedRecommender.mostSimilarUserIDs(userid, howMany);
我想使用Spark ML来实现,但是找不到任何可以帮助我继续前进的类似示例。
到目前为止,我使用余弦相似度实现了将一个用户特征向量与其他用户进行比较的方法:
def cosineSimilarity(vec1: DoubleMatrix, vec2: DoubleMatrix): Double=
{
vec1.dot(vec2)/(vec1.norm2()*vec2.norm2())
}
def user2usersimilarity(userid:Integer, recNumber:Integer): Unit ={
val userFactor=model.userFeatures.lookup(userid).head
val userVector=new DoubleMatrix(userFactor)
val s1=cosineSimilarity(userVector,userVector)
val sims=model.userFeatures.map{case(id,factor)=>
val factorVector=new DoubleMatrix(factor)
val sim=cosineSimilarity(factorVector, userVector)
(id,sim)
}
val sortedSims=sims.top(recNumber+1)(Ordering.by[(Int, Double),Double] {case(id, similarity)=>similarity})
println(sortedSims.slice(1,recNumber+1).mkString("\n"))
}
就推荐质量而言,此方法可与MovieLens数据集配合使用。但是,我的担心与这种算法的性能有关。由于我必须为系统中的所有用户生成推荐,因此使用这种方法,我会将每个用户与系统中的所有其他用户进行比较。
如果有人可以建议如何将用户的比较限制在前N个邻居之间,或者在我的用例中效果更好的其他算法,我将不胜感激。
最佳答案
如何使用聚类算法?训练一次,部署模型,使用模型识别新示例属于哪个集群,然后随机推荐同一集群中的用户?这只是一个主意...
关于apache-spark - 如何使用Spark ML推荐最相似的用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38320310/