0

我试图理解这里的例子,它计算矩阵中向量对之间的 Jaccard 相似度。

val aBinary = adjacencyMatrix.binarizeAs[Double]

// intersectMat holds the size of the intersection of row(a)_i n row (b)_j
val intersectMat = aBinary * aBinary.transpose
val aSumVct = aBinary.sumColVectors
val bSumVct = aBinary.sumRowVectors

//Using zip to repeat the row and column vectors values on the right hand
//for all non-zeroes on the left hand matrix
val xMat = intersectMat.zip(aSumVct).mapValues( pair => pair._2 )
val yMat = intersectMat.zip(bSumVct).mapValues( pair => pair._2 )

为什么最后一条评论提到非零值?据我所知,该._2函数选择一对独立于第一个元素的第二个元素。在什么时候(0, x)消除对?

4

1 回答 1

2

是的,我对烫伤一无所知,但这似乎很奇怪。如果您查看zip实现,它会特别提到它执行外部连接以在任一侧保留零。因此,该评论似乎不适用于matrix.zip.

除了查看 zip 返回的维度之外,这一行似乎只是复制了aSumVct每一列的列向量:

val xMat = intersectMat.zip(aSumVct).mapValues( pair => pair._2 )

我也觉得val bSumVct = aBinary.sumRowVectors可疑,因为它沿错误的维度对矩阵求和。感觉像这样会更好:

val bSumVct = aBinary.tranpose.sumRowVectors

这在概念上与 相同aSumVct.transpose,因此在一天结束时,在单元格 (i, j) 中,xMat + yMat我们找到 的元素之和row(i) 加上的元素之和row(j),然后我们减去intersectMat以调整重复计数。

编辑:通过谷歌搜索发现了这篇博文:http://www.flavianv.me/post-15.htm。似乎评论与该版本有关,其中要比较的向量位于两个不一定具有相同大小的单独矩阵中。

于 2013-07-02T07:17:44.023 回答