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)]