2015-05-05 64 views
4

我在想火花余弦相似度是否可以用于稀疏输入数据?我看到的例子,其中,所述输入包括所述形式的空间分隔的特征的行:火花余弦相似度(DIMSUM算法)稀疏输入文件

id feat1 feat2 feat3 ... 

但是我有一种固有的稀疏,隐式反馈设置和想有输入形式:

id1 feat1:1 feat5:1 feat10:1 
id2 feat3:1 feat5:1 .. 
... 

我想利用稀疏来改善计算。最后我还希望使用DIMSUM算法来计算最近已被纳入到Spark中的所有对相似度。有人可能会建议一个稀疏输入格式,可以在火花上使用DIMSUM吗?我检查了示例代码,并在它的评论中写道“输入必须是一个密集矩阵”,但是这个代码在示例中,所以我不知道它是否仅指一个特定的情况。

spark/examples/src/main/scala/org/apache/spark/examples/mllib/CosineSimilarity.scala 

这就是我指的示例代码的路径。

只需几行代表稀疏输入格式(从推荐系统的角度来看,user_id feat1:1 feat2:1 ...)以处理余弦相似性将非常有帮助。

如果我将user_ids作为字符串离开,它也可以吗?

我知道libsvm的格式是类似的,但没有一个用户ID的概念,在这种情况下,仅使用要素投入情况,所以我想知道的LIBSVM格式如何转化为推荐系统的域名?

我对这个非常简单的问题表示歉意,我对Spark非常新,并且只是让我的脚湿了。

任何帮助将不胜感激。提前致谢!

回答

2

为什么不呢?天真的解决方案可以看起来或多或少像这样:

// Parse input line 
def parseLine(line: String) = { 
    def parseFeature(feature: String) = { 
     feature.split(":") match { 
      case Array(k, v) => (k, v.toDouble) 
     } 
    } 

    val bits = line.split(" ") 
    val id = bits.head 
    val features = bits.tail.map(parseFeature).toMap 
    (id, features) 
} 

// Compute dot product between to dicts 
def dotProduct(x: Map[String, Double], y: Map[String, Double]): Double = ??? 

// Compute norm of dict 
def norm(x: Map[String, Double]): Double = ??? 

// Compute cosine similarity 
def sparseCosine(x: Map[String, Double], y: Map[String, Double]): Double = { 
    dotProduct(x, y)/(norm(x) * norm(y)) 
} 

// Parse input lines 
val parsed = sc.textFile("features.txt").map(parseLine) 

// Find unique pairs 
val pairs = parsed.cartesian(parsed).filter(x => x._1._1 != x._2._1) 

// Compute cosine similarity between pairs 
pairs.map { case ((k1, m1), (k2, m2)) => ((k1, k2), sparseCosine(m1, m2)) }