Java PCA的符号与Apache Spark的预期相反

Java PCA的符号与Apache Spark的预期相反,java,apache-spark,statistics,Java,Apache Spark,Statistics,我用一本经典统计书中的一些练习和例子来训练自己,并对我在apachespark上学到的内容进行调整,以确保我能够重现它 在本书的一章中,作者从两个变量计算PCA。美国一些大学排名的HiCi和SCi值的主成分 该示例从这些值开始,共有100个人: | University | X1 (HiCi) | X2 (SCi) | Harvard    |    100    |   100 | Stanford | 86.1 | 70.3 | Berkeley | 67

我用一本经典统计书中的一些练习和例子来训练自己,并对我在
apachespark
上学到的内容进行调整,以确保我能够重现它

在本书的一章中,作者从两个变量计算PCA。美国一些大学排名的
HiCi
SCi
值的主成分

该示例从这些值开始,共有100个人:

| University | X1 (HiCi) | X2 (SCi)  
| Harvard    |    100    |    100  
| Stanford   |   86.1    |   70.3
| Berkeley   |   67.9    |   69.2
| Cambridge  |   54.0    |   65.4
| M.I.T.     |   65.9    |   61.7
...
然后,作者将这些值标准化:

| University | X1* (HiCi) | X2* (SCi)  
| Harvard    |    3.70    |   3.19  
| Stanford   |    2.74    |   0.81
| Berkeley   |    1.48    |   0.73
| Cambridge  |    0.51    |   0.42
| M.I.T.     |    1.34    |   0.13
...
并进行PCA计算,以找到以下第一个主分量值:

| University | X1* (HiCi) | X2* (SCi)  | Principal component
| Harvard    |    3.70    |   3.19     |        4.87
| Stanford   |    2.74    |   0.81     |        2.51
| Berkeley   |    1.48    |   0.73     |        1.56
| Cambridge  |    0.51    |   0.42     |        0.66
| M.I.T.     |    1.34    |   0.13     |        1.04
...
为了用ApacheSpark2.4.4再现它,我编写了以下测试:

/**
*这是一个冷静的原则。
*/
@试验
@显示名称(“ACP:美国大学分类”)
公共无效成分原则(){
//分类(变量HiCi和SCi des universités America ines)。
数据集DSHICISI=denseRowWithVectors(
d(100100),d(86.1,70.3),d(67.9,69.2),d(54.0,65.4),d(65.9,61.7),,
d(58.4,50.3),d(56.5,69.6),d(59.3,46.5),d(50.8,54.1),d(46.3,65.4),
d(57.9,63.2),d(54.5,65.1),d(57.4,75.9),d(59.3,64.6),d(59.9,70.8),
d(52.4,74.1),d(52.9,67.2),d(54.0,59.8),d(41.3,67.9),d(41.9,80.9),,
d(60.7,77.1),d(35.1,68.6),d(40.6,62.2),d(39.2,77.6),d(38.5,63.2),,
d(44.5,57.6),d(35.5,38.4),d(39.2,53.4),d(46.9,57.0),d(41.3,53.9),,
d(27.7,23.2),d(46.9,62.0),d(48.6,67.0),d(39.9,45.7),d(42.6,42.7),
d(31.4,63.1),d(40.6,53.3),d(46.9,54.8),d(23.4,54.2),d(30.6,38.0),,
d(31.4,51.0),d(27.7,56.6),d(45.1,58.0),d(46.9,64.2),d(35.5,48.9),,
d(25.7,51.7),d(39.9,44.8),d(24.6,56.9),d(39.9,65.6),d(37.1,52.7);;
//大学校友会。
dshicisi.show(100,假);
//瓦卢尔斯中心酒店。
StandardScaler scaler=new StandardScaler().setInputCol(“特征”).setOutputCol(“缩放特征”).setWithStd(真)。setWithMean(真);
Dataset transformedDF=scaler.fit(dshicisc).transform(dshicisc);
Dataset centreReduit=transformedDF.select(“缩放特征”);
//没有两个变量,一个是外部变量,另一个是组成原理。
PCA acp=新PCA().setInputCol(“缩放特征”).setK(1);
数据集resultat=acp.fit(centerreduit).transform(centerreduit);
结果显示(100,假);
}
/**
*Cr Ee Enter DataTet行VeTeurs密集的组成部分''UpPLETE de ValueS。
*@param listeuppletsvaluers liste de n-upplets。
*@return数据集密集。
*/
受保护的数据集denseRowWithVectors(双[…]列表支持向量){
列表数据=新的ArrayList();
for(double[]upplet:listeUppletsValeurs){
Vector vecteur=Vectors.dense(uplet);
data.add(RowFactory.create(vecteur));
}
StructType架构=新StructType(新StructField[]{
new StructField(“features”,new VectorUDT(),false,Metadata.empty()),
});
返回this.session.createDataFrame(数据,模式);
}
/**双…=>双[]**/
受保护双[]d(双…阀){
返回valeurs;
}
价值观得到了很好的介绍:

+-------------+
|features     |
+-------------+
|[100.0,100.0]|
|[86.1,70.3]  |
|[67.9,69.2]  |
|[54.0,65.4]  |
|[65.9,61.7]  |
...
标准化是可行的,但PCA不是预期的:它有一个相反的标志

+-------------------------------------------+------------------------+
|scaledFeatures                             |pca_a632d8c48010__output|
+-------------------------------------------+------------------------+
|[3.6421736835169782,3.156450874585141]     |[-4.807353527775403]    |
|[2.693904143528853,0.8064410737434008]     |[-2.4751178396271087]   |
|[1.4522850336163453,0.7194036737122256]    |[-1.5356158115782794]   |
|[0.5040154936282204,0.4187290190590739]    |[-0.6524789022238617]   |
|[1.3158433731863994,0.12596685531784674]   |[-1.0195137897594777]   |
...

我为什么会有这种行为?

。谢谢,如果你把你的评论作为回答,我会接受的。