数据砖上的pyspark余弦相似度(项目-项目)

时间:2019-05-18 22:15:59

标签: pyspark cosine pos

我正在使用Azure数据块,我有一个Spark数据框(二进制),看起来像(如果我们只有5种产品):

customer_id .   apple.  blueberry .   milk .   cream .  pasta . 
  c1 .             1 .       0 .        0 .       1 .      1
  c2 .             0 .       1 .        1 .       0 .      0
  c3 .             0 .       1 .        0 .       1 .      0
  c4 .             1 .       0 .        1 .       0 .      0
  c5 .             0 .       1 .        1 .       0 .      0
  c6 .             0 .       1 .        0 .       0 .      0
  c7 .             0 .       1 .        1 .       1 .      0
  c8 .             0 .       0 .        0 .       0 .      0
  c9 .             1 .       1 .        1 .       0 .      0\

然后我要计算产品之间的余弦相似度 结果如下

prod1 .      prod2 .    cos_sim
apple .      apple .       1
apple .      blueberry .  0.4
apple .      milk .       0.2
apple .      cream .      ...
apple .      pasta .      ...
blueberry .  blueberry .    1
blueberry .   milk .       0.6

如果不将原始spark数据框制作为Pandas datafram,我怎么能实现呢?

我知道两种方法都可以实现我的目标,但是两种方法都存在问题:

  1. 我需要首先将当前数据帧转换为rowmatrix,然后使用MLlib中的function:columnSimilarities()进行计算 如何将数据框转换为行矩阵? RDD和spark数据框有什么区别?

  2. 我将自己的cosin_dis函数定义为:

def cos_sim(a,b):
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

然后需要将我的数据集转换为cos_sim(a,b)可以处理的格式 我不知道该如何依赖

现在,我设法将spark DF更改为pandas,然后仅使用一个节点执行:

    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

for i in range(1,n):
  t = time.time()
  cols = c[i:n]
  x = df_train[c[i]]
  for j in range(i,n):
    y = df_train[c[j]]
    results.append(cos_sim(x,y))
  sim_matrix.loc[row_index, cols] = results
  row_index += 1
  results = []
  elapsed = time.time() - t
  print("%s / %s in %s s" % (i,j,elapsed))

但是这仍然不能利用databricks pareller的计算能力。

如果您给我任何建议,将不胜感激

0 个答案:

没有答案