2017-08-07 7 views
0

tl; dr 行の類似性を比較するためにpySparkを使用するにはどうすればよいですか?pySparkの列類似性の問題

私は私が従うように余弦類似度を計算することができるscipyのダウンロードを使用して互いに

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

に各列の類似性を比較したいnumpyの配列を持っている...

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

として私はpySparkを使ってSparkを使って見ているオリジナルの(475行)マトリックスよりもはるかに大きなセットに拡張しようとしています

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とbは元の行数と一致しない次元を持つ)...今度は一致します各行(len(pdArray [0])= 749)では488がどこから来ているのか分かりません

749が存在するため、データを先に転記する必要があります。あれは正しいですか?

最後に、この場合、寸法が(749,749)でないのはなぜですか?

+0

これに対して、疎なベクトルが何行表示されるのか、rowMat.rows.collect()? – Suresh

答えて

1

最初に、columnSimilaritiesメソッドは、類似性マトリックスの上三角部分のオフ対角成分のみを返します。対角線に沿って1がない場合、結果の類似性行列の行全体に0を持つことができます。

第2に、pyspark RowMatrixは有意な行インデックスを持たない。したがって、本質的にCoordinateMatrixからRowMatrixに変換するとき、MatrixEntryiの値は、便利なもの(おそらくいくらかの増分インデックス)にマップされています。したがって起こりそうなことは、すべて0が単純に無視されている行と、RowMatrixに変換するとマトリックスが垂直方向に押しつぶされていることです。

columnSimilaritiesメソッドで計算した直後に類似性行列の次元を検査するのはおそらく意味があります。 numRows()numCols()の方法を使用してこれを行うことができます。

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

これ以外にも、正確なベクトルの類似性を得るために行列を転置する必要があるようです。さらに、RowMatrixのような形式でこれが必要な理由がある場合は、意味のある行インデックスを持ち、変換時に元のCoordinateMatrixの行インデックスを保持するIndexedRowMatrixを試すことができます。

関連する問題