【问题标题】:How to get the correlation matrix of a pyspark data frame?如何获取pyspark数据框的相关矩阵?
【发布时间】:2021-10-29 00:31:13
【问题描述】:

我有一个很大的 pyspark 数据框。我想得到它的相关矩阵。我知道如何使用熊猫数据框获取它。但是我的数据太大而无法转换为熊猫。所以我需要用 pyspark 数据框得到结果。我搜索了其他类似的问题,答案对我不起作用。 有谁能够帮我?谢谢!

数据示例: data example

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    欢迎来到 SO!

    示例数据

    我准备了一些虚拟数据以便于复制(也许下次您也可以提供一些易于复制的数据;-)):

    data = pd.DataFrame(np.random.random((10, 5)), 
                       columns=["x{}".format(x) for x in range(5)])
    df = spark.createDataFrame(data)
    
    df.show()
    

    这是数据:

    +-------------------+-------------------+-------------------+-------------------+--------------------+
    |                 x0|                 x1|                 x2|                 x3|                  x4|
    +-------------------+-------------------+-------------------+-------------------+--------------------+
    | 0.9965335347601945|0.09311299224360992| 0.9273393764180728| 0.8523333283310564|  0.5040716744686445|
    | 0.2341313103221958| 0.9356109544246494| 0.6377089480113576| 0.8129047787928055| 0.22215891357547046|
    | 0.6310473705907303| 0.2040705293700683|0.17329601185489396| 0.9062007987480959| 0.44105687572209895|
    |0.27711903958232764| 0.9434521502343274| 0.9300724702792151| 0.9916836130997986|  0.6869145183972896|
    | 0.8247010263098201| 0.6029990758603708|0.07266306799434707| 0.6808038838294564| 0.27937146479120245|
    | 0.7786370627473335|0.17583334607075107| 0.8467715537463528|   0.67702427694934|  0.8976402177586831|
    |0.40620117097757724| 0.5080531043890719| 0.3722402520743703|0.14555317396545808|  0.7954133091360741|
    |0.20876805543974553| 0.9755867281355178| 0.7570617946515066| 0.6974893162590945|0.054708580878511825|
    |0.47979629269402546| 0.1851379589735923| 0.4786682088989791| 0.6809358266732168|  0.8829180507209633|
    | 0.1122983875801804|0.45310988757198734| 0.4713203140134805|0.45333792855503807|  0.9189083355172629|
    +-------------------+-------------------+-------------------+-------------------+--------------------+
    

    解决方案

    ml子包pyspark.ml.stat中有关联函数。但是,它要求您提供Vector 类型的列。因此,您需要先使用VectorAssembler 将列转换为向量列,然后再应用相关性:

    from pyspark.ml.stat import Correlation
    from pyspark.ml.feature import VectorAssembler
    
    # convert to vector column first
    vector_col = "corr_features"
    assembler = VectorAssembler(inputCols=df.columns, outputCol=vector_col)
    df_vector = assembler.transform(df).select(vector_col)
    
    # get correlation matrix
    matrix = Correlation.corr(df_vector, vector_col)
    

    如果您想将结果作为一个 numpy 数组(在您的驱动程序上),您可以使用以下内容:

    matrix.collect()[0]["pearson({})".format(vector_col)].values
    
    array([ 1.        , -0.66882741, -0.06459055,  0.21802534,  0.00113399,
           -0.66882741,  1.        ,  0.14854203,  0.09711389, -0.5408654 ,
           -0.06459055,  0.14854203,  1.        ,  0.33513733,  0.09001684,
            0.21802534,  0.09711389,  0.33513733,  1.        , -0.37871581,
            0.00113399, -0.5408654 ,  0.09001684, -0.37871581,  1.        ])
    

    【讨论】:

    • 非常感谢。我得到了矩阵。再问一个问题,你知道如何轻松地将头部(列名)添加到矩阵中吗?
    • 列顺序应该保持不变。因此,您可以简单地使用df.columns 来获取列名。
    • 您好,我将如何正常打印矩阵 corr。它是这样输出的i.stack.imgur.com/uBRRU.png
    • @abdoulsn 您将不得不重塑 numpy 数组。一种方法如下所示。请注意,它是一个方阵。 cor_np = matrix.collect()[0]["pearson({})".format(vector_col)].values;昏暗 = len(cor_np); cor_mat = cor_np.reshape((dim,dim));
    • 执行第二部分查看数组时出现错误
    【解决方案2】:

    更清晰:

    from pyspark.ml.stat import Correlation
    from pyspark.ml.feature import VectorAssembler
    
    # convert to vector column first
    vector_col = "corr_features"
    assembler = VectorAssembler(inputCols=df.columns, outputCol=vector_col)
    df_vector = assembler.transform(df).select(vector_col)
    
    matrix = Correlation.corr(df_vector, vector_col)
    cor_np = matrix.collect()[0][matrix.columns[0]].toArray()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-19
      • 2019-09-26
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2019-10-20
      • 2021-11-26
      • 2021-02-13
      相关资源
      最近更新 更多