2017-08-24 3 views
0

Je tentais faire columnSimiliraties d'utilisation via pyspark etpySpark toRowMatrix confusion

import pyspark 
pyspark.__version__ 
#'2.2.0' 

from pyspark.mllib.linalg.distributed import RowMatrix, IndexedRowMatrix 

test = np.array[[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10]] 

# so I can compare rows with each other I need to transpose my data 
test = np.transpose(test) 

# Calculate exact similarities 
exactSim = mat.columnSimilarities() 
print(exactSim.numRows(),exactSim.numCols()) 
# 4 4 

Comme prévu cela me donne une matrice 4 x 4

Quand je produis un rowMatrix de cela, je pense que cela devrait conserver cette forme

rowMat = exactSim.toRowMatrix() 
print(rowMat.numRows(), rowMat.numCols()) 
# 3 4 

Donc, en quelque sorte, je perds des lignes sur cette conversion.

Je crois que c'est la dernière ligne qui est tous les zéros - mais idéalement, je voudrais toutes les lignes sorties ... des idées comment je peux obtenir la matrice carrée?

Répondre

0

De la réponse à votre question précédente Problems with pySpark Columnsimilarities,

[T] il columnSimilarities méthode renvoie uniquement les hors diagonale entrées de la partie triangulaire supérieure de la matrice de similarité. Avec l'absence des 1 le long de la diagonale, vous pouvez avoir 0 pour lignes entières dans la matrice de similarité résultant.

En effet, dans cet exemple, le RDD sous-jacente de la matrice entrées Votre matrice résultante est la suivante:

>>> exactSim.entries.collect() 

[MatrixEntry(0, 1, 1.0), MatrixEntry(0, 2, 1.0), 
MatrixEntry(0, 3, 1.0), MatrixEntry(1, 2, 1.0), 
MatrixEntry(1, 3, 1.0), MatrixEntry(2, 3, 1.0)] 

Ceci est une représentation clairsemée de la matrice sous-jacente, ce qui signifie qu'aucun des entrées de valeur zéro sont incluses . Ainsi, le percevant comme une matrice dense, nous avons en fait:

[[0.0, 1.0, 1.0, 1.0], 
[0.0, 0.0, 1.0, 1.0], 
[0.0, 0.0, 0.0, 1.0], 
[0.0, 0.0, 0.0, 0.0]] 

PySpark stocke les columnSimilarities de la manière la plus efficace. C'est parce que, mathématiquement parlant, la matrice sous-jacente est une matrice symétrique et les entrées diagonales seront toujours 1.0 quelle que soit votre entrée. Ainsi, tout ce qui est nécessaire pour calculer et stocker est la partie triangulaire supérieure hors diagonale. Dans cet esprit, il est assez simple de renvoyer la matrice de similarité complète. Nous faisons cela en combinant les entrées triangulaires supérieures avec la transposition des entrées triangulaires supérieures (les entrées triangulaires inférieures) et les entrées diagonales.

entryRDD=exactSim.entries\ 
      .union(exactSim.transpose().entries)\ 
      .union(sc.parallelize([(i,i,1.0) for i in range(exactSim.numCols())])) 

rowMat=CoordinateMatrix(entryRDD).toRowMatrix() 

donnant la matrice de similarité complète désirée en tant que PySpark RowMatrix.

+0

pouvez-vous s'il vous plaît interpréter le résultat de l'entrée maxtrix comme comment puis-je savoir lesquels ont été comparés étant donné que je et j sont les colonnes. Je veux dire quelles données de var test sont comparées. –