如何对镶木地板文件应用主成分分析?

问题描述 投票:0回答:1

我有一个包含id的aparquet文件,feature .id为int,feature为double。我想应用pca算法来减小尺寸。

parquet file

 val lData =  sqlContext.read.parquet("/usr/local/spark/dataset/model/data/user")
val vecData = lData.rdd.map(s => Vectors.dense(s.getInt(0),s.getDouble(1))).cache() 
val mat = new RowMatrix(vecData)
    val pc = mat.computePrincipalComponents(5)
    val projected = mat.multiply(pc)
val projectedRDD=projected.rows
 projectedRDD.saveAsTextFile("file:///usr/local/spark/dataset/PCA")

但出现此错误

由于:java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofRef无法转换为java.lang.Double

如何解决?

scala apache-spark apache-spark-mllib pca
1个回答
0
投票

Salma,

使用文件,我们可以看到要素是一个数组[Double]:

lData.printSchema

root
 |-- id: integer (nullable = true)
 |-- features: array (nullable = true)
 |    |-- element: double (containsNull = true)

为了使代码正常工作,您可以将第二行更改为:

val vecData = lData.rdd.map(s => Vectors.dense(s.getInt(0),s.getAs[Seq[Double]](1):_*)).cache()

注意:通常,我只使用Vector中的功能。取决于您的id代表什么,也许您不需要s.getInt(0)部分。

© www.soinside.com 2019 - 2024. All rights reserved.