首页 > 解决方案 > 特征交叉、稀疏矩阵乘法、Spark

问题描述

我正在 Spark 中做一个项目,需要应用特征交叉才能使用经度和纬度。我目前正在研究稀疏矩阵乘法。然而,由于它是在 scala 中制作的,我不知道如何转换它,因此我用谷歌搜索并找到了一个旧答案

所以对于我的问题,我的数据目前是基于以下代码的数据框:

# Calculate how many buckets needed (Bins)
discretizer_Lat = QuantileDiscretizer(numBuckets=100, inputCol="Start_Lat", outputCol="Start_Lat_disc")
discretizer_Lng = QuantileDiscretizer(numBuckets=100, inputCol="Start_Lng", outputCol="Start_Lng_disc")

# Into categorical values
indexer_cord = [StringIndexer(inputCol=c + "_disc", outputCol=c+"_IDX") for c in ["Start_Lat","Start_Lng"]]

# One-hot 
encoder_cord = OneHotEncoderEstimator(inputCols=[indexer.getOutputCol() for indexer in indexer_cord], outputCols=["{0}_vec".format(indexer.getOutputCol()) for indexer in indexer_cord])

# TODO: Feature cross between data
pipeline_cord = Pipeline(stages=[discretizer_Lat,discretizer_Lng, *indexer_cord, encoder_cord])
preprocessed_cord = pipeline_cord.fit(df).transform(df)

position = VectorAssembler(inputCols=["Start_Lat_IDX_vec","Start_Lng_IDX_vec"], outputCol="position")

df = position.transform(preprocessed_cord)

preprocessed_cord包含我有Start_Lat_IDX_vecStart_Lng_IDX_vec的数据框,并且想应用特征交叉或在我的理解中稀疏向量乘法。

我想使用的功能:

def coordinateMatrixMultiply(leftmatrix, rightmatrix):
    left  =  leftmatrix.entries.map(lambda e: (e.j, (e.i, e.value)))
    right = rightmatrix.entries.map(lambda e: (e.i, (e.j, e.value)))
    productEntries = left \
        .join(right) \
        .map(lambda e: ((e[1][0][0], e[1][1][0]), (e[1][0][1]*e[1][1][1]))) \
        .reduceByKey(lambda x,y: x+y) \
        .map(lambda e: (*e[0], e[1]))
    return productEntries

问题: 如何发送数据帧作为输入来计算新的稀疏向量?

标签: pythonapache-sparksparse-matrix

解决方案


推荐阅读