在Pyspark中执行PCA每次运行返回不同的结果



有人能帮助我理解为什么我的PCA每次运行都得到不同的结果吗?我在Pyspark使用Databricks工作

我的代码的当前实现如下

from pyspark.ml.feature import PCA
from pyspark.mllib.linalg import Vectors

pca = PCA(k=35, inputCol="scaled_features", outputCol="pcaFeatures")
model = pca.fit(df.select('scaled_features'))
result = model.transform(df.select('scaled_features'))
print(model.explainedVariance)

如果我多次运行此代码,我得到不同的结果解释方差差异非常小,但是当我尝试执行K-Means聚类之后,差异改变了结果很多。

PySpark是一个分布式计算系统,依赖于分布式版本的k-Means和PCA算法。在分布式版本中,由于数据局部性的性质和缺乏作为必要设计约束的数据集的通用视图,它们可能是非确定性的,并且具有非零错误界限(参见底部的链接)。

每个算法都被设计成没有一台机器可以一次访问所有数据的方式,以允许数据集太大而无法这样做。在计算的每一步中,数据的局部段用于生成中间结果的数据,然后在具有可用容量的节点之间进行洗牌。将哪个条目与其他条目分组可能会更改PCA的结果。机器以什么顺序可用,哪些元素为下一次迭代做好了准备,这是不容易同步的。

k-Means(即使在单个机器上)也可能非常不确定-它对集群的初始种子质心非常敏感。确保始终从相同的质心开始会有所帮助(但如果是在不断变化的PCA特征上执行,则没有帮助)。小心地在每台机器上随机设置种子,这样它们就不会发生碰撞,这也是需要考虑的事情。此外,确保在运行开始时使用排序/索引将相同的数据分配给相同的分区也会有所帮助。所有这些因素加在一起可能会改善运行之间的差异,但有很多活动部分都在起作用。

https://www.cs.cmu.edu/ninamf/论文/distributedPCAandCoresets.pdf

https://www.researchgate.net/publication/232063041_Principal_Component_Analysis_for_Dimension_Reduction_in_Massive_Distributed_Data_Sets

最新更新