在Databricks环境使用Pyspark执行PCA每次运行结果不同的问题咨询
结果不稳定的核心原因
- PySpark
pyspark.ml.feature.PCA默认采用随机奇异值分解(SVD)近似算法实现,该算法为了提升大规模数据下的计算效率,加入了随机采样步骤,本身就会存在微小的数值波动,是导致每次运行explained variance结果不一致的核心诱因。 - 你没有显式指定PCA的随机种子,算法每次运行会生成随机的种子值,进一步放大了结果的差异。
- PCA输出的特征数值的微小偏差,会被对输入特征敏感度极高的K-Means聚类算法放大,最终导致聚类结果出现明显差异。
修复方案
- 初始化PCA实例时显式指定固定的随机种子,即可保证每次运行结果完全可复现,修改代码如下:
from pyspark.ml.feature import PCA from pyspark.ml.linalg import Vectors # 注意原代码导入的是mllib包的Vectors,ml模块建议对应使用ml.linalg下的工具类 # 新增seed参数,数值可自定义固定值即可 pca = PCA(k=35, inputCol="scaled_features", outputCol="pcaFeatures", seed=1024) model = pca.fit(df.select('scaled_features')) result = model.transform(df.select('scaled_features')) print(model.explainedVariance)
- 如果对PCA精度要求极高,不需要近似加速,可以将PCA的
k参数设置为大于等于输入特征维度-1,此时PySpark会自动切换到精确SVD算法,无随机误差,仅会在特征维度很高时降低计算效率。 - 后续运行K-Means聚类时也建议同步设置固定
seed参数,排除聚类算法本身的随机性干扰。
内容的提问来源于stack exchange,提问作者Pedro Alves
相关产品推荐
相关产品推荐

