Apache spark Spark余弦相似性(DIMSUM算法)稀疏输入文件

Apache spark Spark余弦相似性(DIMSUM算法)稀疏输入文件,apache-spark,sparse-matrix,cosine-similarity,Apache Spark,Sparse Matrix,Cosine Similarity,我想知道Spark余弦相似性是否有可能处理稀疏的输入数据?我看到过一些例子,其中输入由表格的空间分隔特征行组成: id feat1 feat2 feat3 ... id1 feat1:1 feat5:1 feat10:1 id2 feat3:1 feat5:1 .. ... 但我有一个固有的稀疏、隐含的反馈设置,并希望以以下形式输入: id feat1 feat2 feat3 ... id1 feat1:1 feat5:1 feat10:1 id2 feat3:1 feat5:1 .. .

我想知道Spark余弦相似性是否有可能处理稀疏的输入数据?我看到过一些例子,其中输入由表格的空间分隔特征行组成:

id feat1 feat2 feat3 ...
id1 feat1:1 feat5:1 feat10:1
id2 feat3:1 feat5:1 ..
...
但我有一个固有的稀疏、隐含的反馈设置,并希望以以下形式输入:

id feat1 feat2 feat3 ...
id1 feat1:1 feat5:1 feat10:1
id2 feat3:1 feat5:1 ..
...
我想利用稀疏性来改进计算。最后,我希望使用DIMSUM算法来计算最近并入Spark的所有对的相似性。有人能推荐一种稀疏输入格式,可以在spark上使用DIMSUM吗?我检查了示例代码,在注释中它说“输入必须是密集矩阵”,但这段代码在示例中,所以我不知道它是否只涉及一个特定的案例

spark/examples/src/main/scala/org/apache/spark/examples/mllib/CosineSimilarity.scala
这就是我所指的示例代码的路径

仅用几行代码表示稀疏输入格式的外观(从推荐系统的角度来看,用户id feat1:1 feat2:1…),就可以处理余弦相似性,这将非常有用

如果我将用户ID保留为字符串,也可以吗

我知道libsvm格式是类似的,但在这种情况下没有用户id的概念,只有具有功能的输入实例,所以我想知道libsvm格式如何转换为推荐系统域

我为这些极其简单化的问题道歉,我是一个非常新的火花,我只是想把脚弄湿


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

为什么不呢?朴素的解决方案大致如下所示:

// 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)) }