Как использовать корреляцию с выводом в Spark с использованием Scala

#python #scala #apache-spark #matrix

#питон #scala #apache-искра #матрица

Вопрос:

Я работаю над книгой О’Рейли «Практическое машинное обучение с помощью Scikit-Learn», и в примере сквозного машинного обучения, где мы работаем с набором данных корпуса, я наткнулся на раздел, в котором мы используем некоторые статистические данные, такие как корреляция пальцев ног, чтобы определить, насколько входные функции зависят от выходных данных, а в Python с библиотекой Pandas это так же просто, как сделать это:

 corr_matrix = housing.corr()   

Затем он выполняет следующее:

 corr_matrix["median_house_value].sort_values(ascending=False)  

Что затем дает хороший текстовый вывод корреляции значения median_house_ для всех других входных функций. Теперь я вроде как попытался повторить это с помощью Spark в Scala, и у меня есть следующее:

 import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.ml.stat.Correlation import org.apache.spark.ml.linalg.Matrix   val assembler = new VectorAssembler()  .setInputCols(Array("longitude", "latitude", "housing_median_age", "total_rooms", "population", "households", "median_income", "median_house_value"))  .setOutputCol("features")   val assembled = assembler.transform(dfRaw)  val coeff_df = Correlation.corr(assembled, "features")  val Row(coeff_matrix: Matrix) = coeff_df.head println(s"Pearson correlation matrix:n "   coeff_matrix.toString(10, 100000))  

Как видно, я могу распечатать матрицу, но как я могу воспроизвести эту строку кода Python в Scala, чтобы увидеть аналогичный результат в порядке возрастания?

Ответ №1:

Простого способа сделать это не существует, поэтому я придумал вот это, которое в значительной степени делает то, что я хочу:

 coeff_matrix.rowIter.toSeq.last.toDense.toArray.sorted.reverse foreach println  

Дает мне:

 1.0 0.6880752079585478 0.13415311380656308 0.10562341249320993 0.06584265057005646 -0.024649678888894886 -0.04596661511797852 -0.14416027687465932  

Результат не так интуитивно понятен, как в версии Python. Но, по крайней мере, я смог подойти к нему достаточно близко.