从Apache Spark/ Scala中的功能向量创建一个数组



尝试在Apache Spark和Scala中的功能向量中创建所有功能的数组。我需要这样做,以创建一个微风矩阵,以示算法中的各种吸引力。当前,这些功能包裹在功能向量中,我想分别提取每个功能。我一直在研究以下问题:在Spark

中将iDextostring应用于特征向量

这是我当前的代码:(数据是火花数据框架,所有功能均为双人)

val featureCols = Array("feature1", "feature2", "feature3") 
val featureAssembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
val dataWithFeatures = featureAssembler.transform(data)
//now we slice the features back again
val featureSlicer = featureCols.map {
  col => new VectorSlicer().setInputCol("features").setOutputCol(s"${col}_sliced").setNames(Array(s"${col}"))}
val output = featureSlicer.map(f => f.transform(dataWithFeatures).select(f.getOutputCol).as[Double].collect)
val array = output.flatten.toArray

然而,这会失败以下错误:'无法解析cast(由于数据类型不匹配而导致的" feature1"为double-无法将vectorudt铸造为doubletype'

这似乎很奇怪,因为我可以在没有错误的情况下进行以下操作:

val array: Array[Double] = dataWithFeatures.select("feature1").as[Double].collect()

任何想法如何解决此问题,如果有更好的方法,因为创建一系列数据范围并分别对操作执行操作似乎效率低下。

谢谢!

说明features列是从所有其他功能列组装的vector列,您可以选择features列,将其转换为rdd,然后flatMap IT:

示例数据

dataWithFeatures.show
+--------+--------+--------+-------------+
|feature1|feature2|feature3|     features|
+--------+--------+--------+-------------+
|       1|       2|       3|[1.0,2.0,3.0]|
|       4|       5|       6|[4.0,5.0,6.0]|
+--------+--------+--------+-------------+

import org.apache.spark.ml.linalg.Vector
dataWithFeatures.select("features").rdd.flatMap(r => r.getAs[Vector](0).toArray).collect
// res19: Array[Double] = Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)

相关内容

  • 没有找到相关文章

最新更新