Apache Spark Python Cosine Similitud sobre DataFrames

Para un sistema de recomendación, necesito calcular la similitud de coseno entre todas las columnas de todo un Spark DataFrame.

En Pandas solía hacer esto:

import sklearn.metrics as metrics import pandas as pd df= pd.DataFrame(...some dataframe over here :D ...) metrics.pairwise.cosine_similarity(df.T,df.T) 

Eso genera la Matriz de Similitud entre las columnas (ya que usé la transposición)

¿Hay alguna manera de hacer lo mismo en Spark (Python)?

(Necesito aplicar esto a una matriz compuesta de decenas de millones de filas y miles de columnas, por eso necesito hacerlo en Spark)

Puede usar el método columnSimilarities() en un RowMatrix , que puede calcular las similitudes exactas del coseno, o estimarlo usando el método DIMSUM , que será considerablemente más rápido para conjuntos de datos más grandes. La diferencia en el uso es que para este último, deberá especificar un threshold .

Aquí hay un pequeño ejemplo reproducible:

 from pyspark.mllib.linalg.distributed import RowMatrix rows = sc.parallelize([(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]) # Convert to RowMatrix mat = RowMatrix(rows) # Calculate exact and approximate similarities exact = mat.columnSimilarities() approx = mat.columnSimilarities(0.05) # Output exact.entries.collect() [MatrixEntry(0, 2, 0.991935352214), MatrixEntry(1, 2, 0.998441152599), MatrixEntry(0, 1, 0.997463284056)]