我试图减少我的维度(我已经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)
任何人都知道我为什么会遇到这个问题?
谢谢!
答案 0 :(得分:0)
你正在分裂&#39;;&#39;获取parts
,然后在LabeledPoint
的构建中,您将parts
拆分为&#39;;&#39;再次。我怀疑生成的Vector
长度为1,所以当你计算training.first().features.size/2
时,你会得到0。