我有关于表单中特定项目的用户偏好的数据:
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/