apache-spark - 如何使用 Spark ML 推荐最相似的用户

标签 apache-spark machine-learning apache-spark-mllib recommendation-engine

我有关于表单中特定项目的用户偏好的数据:

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/

相关文章:

apache-spark - Spark 如何在 Hadoop YARN 上准备执行器?

python - 非法指令(核心转储)tensorflow

java - 使用spark从s3读取CSV文件

scala - SBT 测试任务如何管理类路径以及如何从 SBT 测试正确启动 Java 进程

search - 人工定向搜索

python - 以下代码中使用什么公式来计算 ys?

scala - 使用 Scala 转换 LabeledPoint 中 Vector 的 RDD - Apache Spark 中的 MLLib

machine-learning - 处理 apache Spark MLLib 中 SVM 中的缺失值

java - org.apache.xbean.asm5.ClassReader 中的 Spark Java IllegalArgumentException

json - Spark Streaming Scala 将不同结构的json组合成一个DataFrame