0

私は、ペアワイズ相関(spear dataframe)にペアワイズ相関(例えばピアソン)を抽出しようとしています。私は、さらなるクエリや機械学習の入力として、表形式のペアワイズ協調を使用したいと考えています。だからここスパークにおける相関行列からペアワイズ相関を抽出する

が実行されている例です。

データ:

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

関連する問題