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] |
...
我为什么会有这种行为?。谢谢,如果你把你的评论作为回答,我会接受的。