0

스파크 데이터 프레임으로 쌍 상관 (예 : 피어슨)을 추출하려고합니다. 필자는 추가 쿼리 및 기계 학습 입력으로 테이블 형식으로 pairwise coreelation을 사용하려고합니다. 그래서 여기스파크의 상관 행렬에서 쌍렬 상관 관계 추출

은 실행 예이다

데이터 :

import org.apache.spark.sql.{SQLContext, Row, DataFrame} 
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, DoubleType} 
import org.apache.spark.sql.functions._ 

// rdd 
    val rowsRdd: RDD[Row] = sc.parallelize(
     Seq(
     Row(2.0, 7.0, 1.0), 
     Row(3.5, 2.5, 0.0), 
     Row(7.0, 5.9, 0.0) 
    ) 
    ) 

// Schema 
    val schema = new StructType() 
     .add(StructField("item_1", DoubleType, true)) 
     .add(StructField("item_2", DoubleType, true)) 
     .add(StructField("item_3", DoubleType, true)) 

// Data frame 
    val df = spark.createDataFrame(rowsRdd, schema) 

상관 행렬

import org.apache.spark.ml.feature.VectorAssembler 
import org.apache.spark.ml.linalg.Vectors 
import org.apache.spark.sql.Row 
import org.apache.spark.mllib.linalg._ 
import org.apache.spark.mllib.stat.Statistics 
import org.apache.spark.rdd.RDD 

    val rows = new VectorAssembler().setInputCols(df.columns).setOutputCol("corr_features") 
     .transform(df) 
     .select("corr_features") 
     .rdd 
    val items_mllib_vector = rows.map(_.getAs[org.apache.spark.ml.linalg.Vector](0)) 
          .map(org.apache.spark.mllib.linalg.Vectors.fromML) 

    val correlMatrix: Matrix = Statistics.corr(items_mllib_vector, "pearson") 

출력 모든 요소들의 상관 행렬이다. 각 요소 (i : j)와 상관 계수와 각 요소의 이름을 데이터 프레임으로 쌍으로 추출하고 싶습니다.

필요한 출력 :

item_from | item_to | Correlation 
item_1 | item_2 | -0.0096912 
item_1 | item_3 | -0.7313071 
item_2 | item_3 | 0.68910356 
+0

누군가 나에게 어떤 조언을 사용하는 것이 바람직있어 로컬 하나? 어떻게 각 위치에 대한 이름과 상관 관계를 추출 할 루프를 만들겠습니까? – Duesentrieb

답변

0

나는 솔루션을 찾을 수 있었다 약간의 도움으로 :

import scala.collection.mutable.ListBuffer 

val pairwiseArr = new ListBuffer[Array[Double]]() 

for(i <- 0 to correlMatrix.numRows-1){ 
    for(j <- 0 to correlMatrix.numCols-1){ 
    pairwiseArr += Array(i, j, correlMatrix.apply(i,j)) 
    } 
} 

는 스파크로 배열 변환 :

로컬 배열로 결과를 가져 오기를 데이터 프레임 :

case class pairRow(i: Double, j: Double, corr: Double) 

val pairwiseDF = pairwiseArr.map(x => pairRow(x(0), x(1), x(2))).toDF() 
display(pairwiseDF 
배열부터 0

)

ColumnSimilarities