2017-08-07 168 views
0

tl; dr 如何使用pySpark比较行的相似性?pySpark Columns相似性问题

我有一个numpy的阵列,我想每一行的相似之处彼此比较

print (pdArray) 
#[[ 0. 1. 0. ..., 0. 0. 0.] 
# [ 0. 0. 3. ..., 0. 0. 0.] 
# [ 0. 0. 0. ..., 0. 0. 7.] 
# ..., 
# [ 5. 0. 0. ..., 0. 1. 0.] 
# [ 0. 6. 0. ..., 0. 0. 3.] 
# [ 0. 0. 0. ..., 2. 0. 0.]] 

使用SciPy的我可以计算余弦相似之处遵循...

pyspark.__version__ 
# '2.2.0' 

from sklearn.metrics.pairwise import cosine_similarity 
similarities = cosine_similarity(pdArray) 

similarities.shape 
# (475, 475) 

print(similarities) 
array([[ 1.00000000e+00, 1.52204908e-03, 8.71545594e-02, ..., 
      3.97681174e-04, 7.02593036e-04, 9.90472253e-04], 
     [ 1.52204908e-03, 1.00000000e+00, 3.96760121e-04, ..., 
      4.04724413e-03, 3.65324300e-03, 5.63519735e-04], 
     [ 8.71545594e-02, 3.96760121e-04, 1.00000000e+00, ..., 
      2.62367141e-04, 1.87878869e-03, 8.63876439e-06], 
     ..., 
     [ 3.97681174e-04, 4.04724413e-03, 2.62367141e-04, ..., 
      1.00000000e+00, 8.05217639e-01, 2.69724702e-03], 
     [ 7.02593036e-04, 3.65324300e-03, 1.87878869e-03, ..., 
      8.05217639e-01, 1.00000000e+00, 3.00229809e-03], 
     [ 9.90472253e-04, 5.63519735e-04, 8.63876439e-06, ..., 
      2.69724702e-03, 3.00229809e-03, 1.00000000e+00]]) 

由于我正在寻找扩大到比我原来的(475行)矩阵更大的集,我正在通过pySpark使用Spark观看

from pyspark.mllib.linalg.distributed import RowMatrix 

#load data into spark 
tempSpark = sc.parallelize(pdArray) 
mat = RowMatrix(tempSpark) 

# Calculate exact similarities 
exact = mat.columnSimilarities() 

exact.entries.first() 
# MatrixEntry(128, 211, 0.004969676943490767) 

# Now when I get the data out I do the following... 
# Convert to a RowMatrix. 
rowMat = approx.toRowMatrix() 
t_3 = rowMat.rows.collect() 
a_3 = np.array([(x.toArray()) for x in t_3]) 
a_3.shape 
# (488, 749) 

正如你所看到的,数据的形状是a)不再是方形的(它应该是和b)的尺寸与原始行数不匹配......现在它确实匹配(在部分_中的特征数量在每一行(len(pdArray [0])= 749),但我不知道488是从哪里来的

749的存在让我觉得我需要先调换我的数据。那是对的吗?

最后,如果是这种情况,为什么尺寸不是(749,749)?

+0

稀疏向量为此显示多少行rowMat.rows.collect()? – Suresh

回答

1

首先,columnSimilarities方法只返回相似性矩阵的上三角部分的关闭对角条目。由于缺少沿对角线的1,所以在结果相似度矩阵中可能有0个整行。

其次,一个pyspark RowMatrix没有有意义的行索引。所以基本上,当从CoordinateMatrix转换为RowMatrix时,MatrixEntry中的i值被映射为任何方便的值(可能是某个增量索引)。因此,可能发生的情况是,将所有0的行简单地忽略,并且矩阵在将其转换为RowMatrix时垂直压扁。

在用columnSimilarities方法计算后立即检查相似度矩阵的维数可能是有意义的。您可以通过使用numRows()numCols()方法来完成此操作。

print(exact.numRows(),exact.numCols()) 

除此之外,它听起来像是需要转置矩阵以获得正确的向量相似性。此外,如果您在某种类似于RowMatrix的表单中存在某些原因,则可以尝试使用具有有意义的行索引的IndexedRowMatrix,并在转换时保留原始CoordinateMatrix的行索引。