10

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

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

4

1 回答 1

25

火花 >= 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)

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

对于mllib版本,您需要RDD一个Vector

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)

火花 < 1.5.0

PySpark <= 1.4.1 还不支持分布式数据结构,因此没有内置的方法来计算 PCA。如果输入矩阵相对较薄,您可以以分布式方式计算协方差矩阵,收集结果并在驱动程序上本地执行特征分解。

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

  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 。

于 2015-08-02T19:40:58.153 回答