Spark - 主成分分析 - PCA需要许多主成分k> = 1但是给出0

时间:2016-11-03 16:35:56

标签: apache-spark-mllib pca

我试图减少我的维度(我已经120列),因为我想要应用PCA方法:

val data = sc.textFile("data")

val header = data.first

val rows = data.filter(l => l != header)

import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}

val data = rows.map { line =>
  val parts = line.split(';')
  LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(';').map(_.toDouble)))
}.cache()

val splits = data.randomSplit(Array(0.9, 0.1), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

val pca = new PCA(training.first().features.size / 2).fit(data.map(_.features))

但是我收到了这个错误:

java.lang.IllegalArgumentException: requirement failed: PCA requires a number of principal components k >= 1 but was given 0
    at scala.Predef$.require(Predef.scala:233)
    at org.apache.spark.mllib.feature.PCA.<init>(PCA.scala:33)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:59)

任何人都知道我为什么会遇到这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

你正在分裂&#39;;&#39;获取parts,然后在LabeledPoint的构建中,您将parts拆分为&#39;;&#39;再次。我怀疑生成的Vector长度为1,所以当你计算training.first().features.size/2时,你会得到0。