Apache spark 如何推荐使用Spark ML的大多数类似用户

Apache spark 如何推荐使用Spark ML的大多数类似用户,apache-spark,machine-learning,apache-spark-mllib,recommendation-engine,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:U

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

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个邻居的比较,或其他在我的用例中更有效的算法,我将不胜感激。

使用群集算法如何?、培训一次、部署模型、使用模型来确定新示例属于哪个群集,然后随机推荐同一集群中的用户?这只是一个想法…

看看使用交替最小二乘法的Spark协同过滤:

它正是为这种情况而建立的

协同过滤

协同过滤通常用于推荐系统。 这些技术旨在填补用户项的缺失条目 关联矩阵。spark.ml当前支持基于模型的 协同过滤,其中用户和产品由 可用于预测缺失的一小部分潜在因素 条目。spark.ml使用交替最小二乘(ALS)算法 了解这些潜在因素


考虑到您有实际的偏好/评分,您可以使用显式偏好方法(相对于隐式)。

实际上,这与我几天前实施的方法类似。虽然我的解决方案使用两种模型。首先,使用Spark ML K-means根据分配给学生的课程识别学生群。在下一次迭代中,ALS模型用于推荐来自同一集群的属于同一集群的用户。