Я использую блоки данных 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 способа могут достичь моей цели, но у меня есть проблемы в обоих методах:
Мне нужно сначала преобразовать текущий фрейм данных в матрицу строк, а затем использовать функцию: columnSimilities () из MLlib для вычисления
Как я могу преобразовать кадр данных в матрицу строк?
какая разница между RDD и искровым фреймом?
Я определил свою собственную функцию 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))
но, тем не менее, это не означает, что можно использовать вычислительные возможности для обработки данных.
если вы дадите мне какие-либо предложения, буду очень признателен