我正在尝试使用Spark MLlib RowMatrix库在一个小样本数据集上运行PCA,并且获得的矩阵输出与我使用其他程序(Excel和Weka)运行PCA时不同。我正在使用的代码:
val rows = textFile.map { line =>
val values = line.split(",").map(_.toDouble)
Vectors.dense(values)
val mat = new RowMatrix(rows)
val pc: Matrix = mat.computePrincipalComponents(mat.numCols().toInt)
val c = mat.multiply(pc)
println(pc)
这是输入数据集(textFile):
4, 0, 6
16, 8, 2
12, 4, 1
0, 3, 12
1, 5, 18
2, 8, 14
输出:
-0.690617646131419 -0.42474982540272854 0.585350196610755
-0.04140208648197004 -0.7848198589261455 -0.6183394345099498
0.7220340255741673 -0.4512708442338108 0.5244249146042417
然而,当我在excel / weka上运行PCA时的输出是:
0.717 -0.081 0.692
0.191 -0.932 -0.308
-0.67 -0.353 0.653
我相信两种情况下的输出都与原始数据集的每一列对新主成分列的贡献有关(并且知道我可以将这些成分乘以原始数据以获得沿新主成分轴的投影) ,但我不确定为什么在使用不同平台执行PCA时输出会有所不同。
有谁可以解释为什么Spark会产生不同的PCA输出矩阵?另外,有没有办法将此输出矩阵转换为特征向量/值?
由于