PySpark中的PCA分析

lap*_*nio 7 python pca apache-spark apache-spark-ml apache-spark-mllib

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

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

zer*_*323 20

Spark> = 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)
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

Spark <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 .