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関数は最初の要素とは関係なく、ペアの 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であるため、1 日の終わりに のセル (i, j) での要素の合計xMat + yMatの要素の合計を見つけ、次に減算して二重カウントを調整します。row(i) row(j)intersectMat

編集:少しグーグルで検索すると、このブログ投稿が見つかりました: http://www.flavianv.me/post-15.htm . コメントは、比較するベクトルが必ずしも同じサイズではない 2 つの別々の行列にあるバージョンに関連していたようです。

于 2013-07-02T07:17:44.023 に答える