代码之家  ›  专栏  ›  技术社区  ›  Marcin

如何在Spark中计算相异矩阵?

  •  0
  • Marcin  · 技术社区  · 9 年前

    是否有任何函数或方法可以计算给定数据集的不相似度矩阵?我找到了 All-pairs similarity via DIMSUM 但它看起来只适用于稀疏数据。我的真的很密。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jacek Laskowski    9 年前

    尽管 original DIMSUM paper 正在讨论一个矩阵:

    每个维度都是稀疏的,每行最多有L个非零

    哪些值是:

    A的条目已缩放为[1,1]

    这不是一个要求,您可以在密集矩阵上运行它。实际上,如果您从 the databricks blog 你会注意到 RowMatrix 实际上是由 RDD 密集矢量:

    // Load and parse the data file.
    val rows = sc.textFile(filename).map { line =>
        val values = line.split(' ').map(_.toDouble)
        Vectors.dense(values)
    }
    val mat = new RowMatrix(rows)
    

    类似地 CosineSimilarity Spark example 给出未缩放的密集矩阵作为输入。

    您需要注意,唯一可用的方法是 columnSimilarities() ,计算列之间的相似度。因此,如果您的输入数据文件是以record=row的方式构造的,那么您必须首先进行矩阵转置,然后运行相似性。回答你的问题,没有 transpose 在…上 行矩阵 ,MLlib中的其他类型的矩阵确实具有该特性,因此您必须首先进行一些转换。

    Row similarity is in the works 不幸的是,它没有成为最新的Spark 1.5。

    至于其他选项,你必须自己实现。天真的暴力解决方案需要 O(mL^2) 洗牌很容易实现(笛卡尔+你选择的相似性度量),但表现很差(从经验来看)。

    您还可以查看同一个人的不同算法 DISCO 但它没有在Spark中实现(本文还假设了L简约性)。

    最后,请注意,DIMSUM和DISCO都是估计值(尽管非常好)。