我有一个大的 pyspark 数据框,其中的列是一些产品,行是它的价格。我需要计算所有产品的协方差矩阵,但是数据太大而无法转换为pandas数据框,所以我需要用pyspark来做。我到处搜索它,但我无法找到解决这个问题的方法。有谁知道如何做到这一点?
我已经有了相关矩阵,所以任何使用标准差对角矩阵的方法也非常受欢迎。
这是我的数据框两列的示例。
我有一个大的 pyspark 数据框,其中的列是一些产品,行是它的价格。我需要计算所有产品的协方差矩阵,但是数据太大而无法转换为pandas数据框,所以我需要用pyspark来做。我到处搜索它,但我无法找到解决这个问题的方法。有谁知道如何做到这一点?
我已经有了相关矩阵,所以任何使用标准差对角矩阵的方法也非常受欢迎。
这是我的数据框两列的示例。
SparkML 中有许多线性代数函数。您可能正在寻找其中一种RowMatrix
方法,特别是 computeCovariance()
(Spark 文档)。
假设您正在寻找相当于:
dummy = pd.DataFrame([[1,2],[2,1]])
dummy.cov()
然后,您可以从 a 开始dataframe
,使用 pyspark 计算协方差矩阵,如下所示:
from pyspark.mllib.linalg.distributed import RowMatrix
from pyspark.ml.feature import VectorAssembler
df = spark.createDataFrame([[1, 2], [2, 1]])
vector_col = "cov_features"
assembler = VectorAssembler(inputCols=df.columns, outputCol=vector_col, handleInvalid="skip")
df_vector = assembler.transform(df).select(vector_col)
mat_df = RowMatrix(df_vector)
mat_df = RowMatrix(df_vector.rdd.map(list))
result_df = mat_df.computeCovariance()
的矢量化dataframe
是必需的,因为pyspark.mllib.linalg
它正在使用矢量表示。