PySpark 中的 PCA 分析
PCA Analysis in PySpark
正在查看 http://spark.apache.org/docs/latest/mllib-dimensionality-reduction.html。这些示例似乎只包含 Java 和 Scala。
Spark MLlib 是否支持 Python 的 PCA 分析?如果是这样,请给我举个例子。如果没有,如何将 Spark 与 scikit-learn 相结合?
Spark >= 1.5.0
虽然 PySpark 1.5 引入了分布式数据结构 (pyspark.mllib.linalg.distributed
),但看起来 API 相当有限并且没有实现 computePrincipalComponents
方法。
虽然可以使用 from pyspark.ml.feature.PCA
或 pyspark.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
版本,您需要 RDD
of 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)
Spark < 1.5.0
PySpark <= 1.4.1 尚不支持分布式数据结构,因此没有内置方法来计算 PCA。如果输入矩阵相对较薄,您可以以分布式方式计算协方差矩阵,收集结果并在驱动程序上本地执行特征分解。
操作顺序或多或少类似于下面的顺序。分布式步骤后跟操作名称,本地步骤后跟“*”和可选方法。
- 创建
RDD[Vector]
,其中每个元素都是输入矩阵中的一行。您可以对每一行使用 numpy.ndarray
(prallelize
)
- 计算按列统计(
reduce
)
- 使用 2. 的结果使矩阵居中 (
map
)
- 计算每行的外积 (
map outer
)
- 对结果求和得到协方差矩阵(
reduce +
)
- 收集并计算特征分解 * (
numpy.linalg.eigh
)
- 选择前 n 个特征向量 *
- 投影数据(
map
)
关于 Sklearn。您可以像往常一样在驱动程序或工作程序上使用 NumPy(它已在 Mllib
)、SciPy、Scikit locally 上使用。
正在查看 http://spark.apache.org/docs/latest/mllib-dimensionality-reduction.html。这些示例似乎只包含 Java 和 Scala。
Spark MLlib 是否支持 Python 的 PCA 分析?如果是这样,请给我举个例子。如果没有,如何将 Spark 与 scikit-learn 相结合?
Spark >= 1.5.0
虽然 PySpark 1.5 引入了分布式数据结构 (pyspark.mllib.linalg.distributed
),但看起来 API 相当有限并且没有实现 computePrincipalComponents
方法。
虽然可以使用 from pyspark.ml.feature.PCA
或 pyspark.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
版本,您需要 RDD
of 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)
Spark < 1.5.0
PySpark <= 1.4.1 尚不支持分布式数据结构,因此没有内置方法来计算 PCA。如果输入矩阵相对较薄,您可以以分布式方式计算协方差矩阵,收集结果并在驱动程序上本地执行特征分解。
操作顺序或多或少类似于下面的顺序。分布式步骤后跟操作名称,本地步骤后跟“*”和可选方法。
- 创建
RDD[Vector]
,其中每个元素都是输入矩阵中的一行。您可以对每一行使用numpy.ndarray
(prallelize
) - 计算按列统计(
reduce
) - 使用 2. 的结果使矩阵居中 (
map
) - 计算每行的外积 (
map outer
) - 对结果求和得到协方差矩阵(
reduce +
) - 收集并计算特征分解 * (
numpy.linalg.eigh
) - 选择前 n 个特征向量 *
- 投影数据(
map
)
关于 Sklearn。您可以像往常一样在驱动程序或工作程序上使用 NumPy(它已在 Mllib
)、SciPy、Scikit locally 上使用。