PySp中的PCA分析

2024-05-15 00:12:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: orghttp示例docsapachehtmljavalatest
1条回答
网友
1楼 · 发布于 2024-05-15 00:12:32

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

火花<;1.5.0

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

操作顺序多少有点像下面的那个。分布式步骤后面跟着一个操作名,local后面跟着“*”和可选方法。

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

关于Sklearn。您可以使用NumPy(它已经在Mllib中使用)、SciPy、Scikit在本地对驱动程序或工作者使用,方法与通常相同。

相关问题 更多 >

    热门问题