2017-08-24 153 views
0

,我试图通过pyspark做使用columnSimiliraties和pySpark toRowMatrix混乱

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 

正如预期的那样这给了我一个4×4矩阵

当我从这个生成rowMatrix我希望,这应该保留这个形状

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

所以不知何故,我失去了这种转换行。

我相信它是最后一行是全零 - 但理想情况下,我想所有行输出...任何想法如何我可以得到矩阵矩阵?

回答

0

从回答您的前一个问题Problems with pySpark Columnsimilarities

[T]他columnSimilarities方法只返回相似度矩阵的上三角形部分的断开对角线 条目。由于 沿着对角线缺少1,所以在结果相似度矩阵中,整个 行可能有0。

事实上,在这个例子中,矩阵的底层RDD条目的生成的矩阵如下:

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

这是底层矩阵的稀疏表示,这意味着没有一个零值项都被包括。所以,查看此为密集矩阵,我们其实有:

[[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存储columnSimilarities以最有效的方式。这是因为从数学上讲,底层矩阵是一个对称矩阵,无论您的输入如何,对角线条目总是1.0。所以,计算和存储所需的全部是关闭的对角线上三角部分。

考虑到这一点,返回完全相似矩阵是相当直接的。我们通过将上三角条目与上三角条目(下三角条目)和对角条目的转置相结合来完成此操作。

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

rowMat=CoordinateMatrix(entryRDD).toRowMatrix() 

产生期望的完全相似性矩阵作为PySpark RowMatrix。

+0

能否请你解释maxtrix条目的结果,比如我知道哪些是比较给定的i和j是列。我的意思是来自var test的数据正在进行比较。 –