【问题标题】:PCA Analysis in PySparkPySpark 中的 PCA 分析
【发布时间】:2015-10-24 19:03:14
【问题描述】:

查看http://spark.apache.org/docs/latest/mllib-dimensionality-reduction.html。这些示例似乎只包含 Java 和 Scala。

Spark MLlib 是否支持 Python 的 PCA 分析?如果是这样,请给我举个例子。如果没有,如何将 Spark 与 scikit-learn 结合起来?

【问题讨论】:

  • 只是补充一点,这个问题的解决方案正在进行中。在herehere 查看进度。

标签: python apache-spark apache-spark-mllib pca apache-spark-ml


【解决方案1】:

火花 >= 1.5.0

虽然 PySpark 1.5 引入了分布式数据结构 (pyspark.mllib.linalg.distributed),但看起来 API 相当有限,并且没有实现 computePrincipalComponents 方法。

虽然可以使用from pyspark.ml.feature.PCApyspark.mllib.feature.PCA。在第一种情况下,预期输入是带有向量列的数据框:

from pyspark.ml.feature import PCA as PCAml
from pyspark.ml.linalg import Vectors  # Pre 2.0 pyspark.mllib.linalg

df = sqlContext.createDataFrame([
   (Vectors.dense([1, 2, 0]),),
   (Vectors.dense([2, 0, 1]),),
   (Vectors.dense([0, 1, 0]),)], ("features", ))

pca = PCAml(k=2, inputCol="features", outputCol="pca")
model = pca.fit(df)
transformed = model.transform(df)

在 Spark 2.0 或更高版本中,您应该使用 pyspark.ml.linalg.Vector 代替 pyspark.mllib.linalg.Vector

对于mllib 版本,您需要RDDVector

from pyspark.mllib.feature import PCA as PCAmllib

rdd = sc.parallelize([
    Vectors.dense([1, 2, 0]),
    Vectors.dense([2, 0, 1]),
    Vectors.dense([0, 1, 0])])

model = PCAmllib(2).fit(rdd)
transformed = model.transform(rdd)

火花

PySpark

操作顺序或多或少类似于下面的顺序。分布式步骤后跟操作名称,本地由“*”和可选方法。

  1. 创建RDD[Vector],其中每个元素都是来自输入矩阵的单行。您可以为每一行使用numpy.ndarray (prallelize)
  2. 按列计算统计信息 (reduce)
  3. 使用 2. 的结果使矩阵居中 (map)
  4. 计算每一行的外积 (map outer)
  5. 对结果求和以获得协方差矩阵 (reduce +)
  6. 收集和计算特征分解 * (numpy.linalg.eigh)
  7. 选择前 n 个特征向量 *
  8. 投影数据 (map)

关于 Sklearn。您可以像往常一样在驱动程序或工作人员上本地使用 NumPy(它已在 Mllib 中使用)、SciPy、Scikit。

【讨论】:

  • Spark > 2 怎么样?语法似乎发生了变化
  • @MehdiLAMRANI 它对我有用。我正在使用数据块
  • 对@zero323 有疑问如何应用于实际数据框?任何帮助将不胜感激。
  • 我仍然不明白 PCA 库是否会在执行 PCA 之前自动对数据进行标准化。有谁知道吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多