косинусное сходство pyspark (item-item) на кирпичах данных - PullRequest
0 голосов
/ 19 мая 2019

Я использую блоки данных Azure, у меня искровый фрейм данных (двоичный) выглядит (если у нас только 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

как я мог реализовать это, не создавая оригинальный фрейм с искрой в Pandas?

Я знаю, что 2 способа могут достичь моей цели, но у меня есть проблемы в обоих методах:

  1. Мне нужно сначала преобразовать текущий фрейм данных в матрицу строк, а затем использовать функцию: columnSimilities () из MLlib для вычисления Как я могу преобразовать кадр данных в матрицу строк? какая разница между RDD и искровым фреймом?

  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) Я не знаю, как сделать это в искру

Теперь мне удалось изменить 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))

но, тем не менее, это не означает, что можно использовать вычислительные возможности для обработки данных.

если вы дадите мне какие-либо предложения, буду очень признателен

...