#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. Но, по крайней мере, я смог подойти к нему достаточно близко.