2016-11-03 8 views
0

私はPCA法を適用するために次元数を減らそうとしている(私は120列)。スパーク - 主成分分析 - PCAは多くの主成分を必要とするが、0を与えられた。

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

あなたは ';'で分割しています。 partsを取得し、LabeledPointの構成では、 ';'にpartsを分割しています。再び。私は結果としてVectorの長さが1であると思われますので、training.first().features.size/2を計算すると0が得られます。

+0

私はすでに秒数LABELEDPOINT uisng( "")を入れています:data:org.apache.spark.rdd。 RDD [org.apache.spark.mllib.regression.LabeledPoint] = MapPartitionsRDD [3] :40 でも私はまだ同じ問題を抱えています –

関連する問題