我正在尝试使用 scala 将数据帧转换为微风密集矩阵。我找不到任何内置函数来执行此操作,所以这就是我正在做的事情。
import scala.util.Random
import breeze.linalg.DenseMatrix
val featuresDF = (1 to 10)
.map(_ => (
Random.nextDouble,Random.nextDouble,Random.nextDouble))
.toDF("F1", "F2", "F3")
var FeatureArray: Array[Array[Double]] = Array.empty
val features = featuresDF.columns
for(i <- features.indices){
FeatureArray = FeatureArray :+ featuresDF.select(features(i)).collect.map(_(0).toString).map(_.toDouble)
}
val desnseMat = DenseMatrix(FeatureArray: _*).t
这确实工作正常,我得到了我想要的。但是,这会在我的环境中导致 OOM 异常。有没有更好的方法来进行这种转换。我的最终目标是使用密集矩阵计算特征的特征值和特征向量。
import breeze.stats.covmat
import breeze.linalg.eig
val covariance = covmat(desnseMat)
val eigen = eig(covariance)
因此,如果有一种直接的方法可以从数据帧中获取特征值和特征向量,那就更好了。spark ml 中的 PCA 必须使用 features 列进行此计算。有没有办法通过 PCA 访问特征值?