有人能帮我理解为什么我的PCA每次运行都会得到不同的结果吗?我正在使用Databricks在Pyspark中工作
我的代码的当前实现如下
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聚类时,差异会对结果产生很大影响。
发布于 2021-10-26 16:48:06
PySpark是一个分布式计算系统,依赖于k均值和主成分分析算法的分布式版本。在分布式版本中,由于数据局部性的性质以及缺乏作为必要设计约束的数据集的通用视图,它们可能是不确定的,并且具有非零错误界限(请参见底部的链接)。
每种算法都是这样设计的,没有一台机器可以一次访问所有数据,以允许数据集太大而无法这样做。在计算的每个步骤中,数据的本地段用于生成中间结果的数据,然后在具有可用容量的节点之间混洗。该条目与哪些其他条目分组可以改变PCA的结果。机器可用的顺序与哪些元素为下一次迭代做好准备的顺序不容易同步。
k-Means (即使在一台机器上)也可能是非常不确定的-它对集群的初始种子质心非常敏感。确保你总是从相同的质心开始是有帮助的(但如果它是在变化的PCA特征上执行的,这将不会有帮助)。在每台机器上仔细设置随机种子,以便它们不会发生冲突,这也是需要考虑的问题。此外,确保在运行开始时使用排序/索引将相同的数据分配给相同的分区也会有所帮助。所有这些事情加在一起可能会改善运行之间的差异,但有很多移动部件都起到了作用。
https://www.cs.cmu.edu/~ninamf/papers/distributedPCAandCoresets.pdf
https://stackoverflow.com/questions/69731313
复制相似问题