3

RowMatrixにあるメソッドを使用して、さまざまなレコード(コンテンツベース)のコサイン類似性を見つけることができます。私のデータは次のようなものになります。spark mlコサイン類似度:1からnの類似度スコアを得る方法

genre,actor 
horror,mohanlal shobhana pranav 
comedy,mammooty suraj dulquer 
romance,fahad dileep manju 
comedy,prithviraj 

さて、私は上記のテキスト機能(ジャンル、俳優)のTF-IDFを計算するために火花mlのパイプラインを作成しているのと両方を組み立てるために、私のパイプラインでVectorAssemblerを使用しています機能は、単一の列に "機能"。その後、私は参照用thisのガイドを次のです

val matrix = new RowMatrix(vectorRdd) 

で私のRowMatrixを得るRDD[Vector]

に変換する

val vectorRdd = finalDF.map(row => row.getAs[Vector]("features")) 

:その後、私はこれを使用してDataFrameを得て変換しますコサインの類似性と私が必要とするのは、特定のレコードとsklearnのthisメソッドのような他のすべての類似点を見つけるためのspark-mllibのメソッドです。ガイドに表示される:

しかし、私はこれを行う方法が見つかりません。 matrix.columnSimilarities()が何を比較して戻っているのか分かりません。誰かが私が探しているもので私を助けることができますか?

ご協力いただきましてありがとうございます。ありがとう。

答えて

0

2つの小さな機能で自分で計算しました。 2つのデータフレームのクロスジョインでcosineSimilarityを呼び出します(1行目と2行目は別々です)。

def cosineSimilarity(vectorA: SparseVector, 
     vectorB:SparseVector,normASqrt:Double,normBSqrt:Double) : 
    (Double,Double) = { 
     var dotProduct = 0.0 
     for (i <- vectorA.indices){ 
      dotProduct += vectorA(i) * vectorB(i) 
     } 
     val div = (normASqrt * normBSqrt) 
     if (div == 0) 
      (dotProduct,0) 
     else 
      (dotProduct,dotProduct/div) 
    } 

    val normSqrt : (org.apache.spark.ml.linalg.SparseVector => Double) = (vector: org.apache.spark.ml.linalg.SparseVector) => { 
     var norm = 0.0 
     for (i <- vector.indices) { 
      norm += Math.pow(vector(i), 2) 
     } 
     Math.sqrt(norm) 
    } 
関連する問題