3

RowMatrix과 함께 제공되는 columnSimilarities 메서드를 사용하여 다양한 레코드 (내용 기반)의 코사인 유사성을 찾을 수 있음을 읽었습니다. 내 데이터는 다음과 같이 보입니다 : 자, 위의 텍스트 기능의 TF-IDF (장르, 배우)을 계산하는 스파크 ml의 파이프 라인을 만들었습니다Spark ml 코사인 유사성 : 1에서 n까지의 유사도를 얻는 방법

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

을 모두 조립 내 파이프 라인에 VectorAssembler을 사용 기능은 단일 열 "기능"에 있습니다. 그 후, 나는이 사용하여 내 얻을 DataFrame 변환 : 그런 다음 RDD[Vector]

로 변환

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

을, 나는 나의 RowMatrix

val matrix = new RowMatrix(vectorRdd) 

에 의해 나는 참조 this 가이드 다음입니다 얻기 코사인 유사성과 내가 필요한 것은 특정 레코드와 sklearn의 this 메서드와 같은 다른 모든 것들 사이의 유사성을 찾기 위해 spark-mllib의 메서드입니다. 가이드에 표시 :

그러나 이것을 수행하는 방법을 찾을 수 없습니다. matrix.columnSimilarities()이 (가) 비교하고 반환하는 내용을 이해할 수 없습니다. 누군가 내가 찾고있는 것을 도울 수 있습니까?

도움을 주시면 감사하겠습니다. 감사.

답변

0

2 개의 작은 기능으로 직접 계산했습니다. 2 데이터 프레임의 교차 결합에서 cosineSimilarity를 ​​호출하십시오 (첫 번째 줄과 두 번째 줄은 각각 별도의 줄을 사용하십시오)

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