Я применяю deepwalk / node2vec к графу с 15 миллионами узлов и миллиардами ребер. Я сгенерировал вложения для графа, и получение этих вложений в матрицу смежности требует разреженных матриц. Я работаю над кодом в https://github.com/palash1992/GEM/tree/master/gem.
Вот небольшой воспроизводимый пример с графом выборки гораздо меньшего размера.
'embs' - это массив чисел с плавающей точкой, форма (399224, 64), которая генерируется из алгоритма Deepwalk и затем обрабатывается в вложенные краевые вложения путем взятия произведения Адамара (не показано в этом коде).
#Generate approximation of embeddings
embs = scipy.sparse.random(399224, 64, density=0.01)
embs = np.asarray(embs)
Это код, который я конвертирую для использования разреженных матриц:
node_num = 1000
#Create non-sparse adjacency matrix from embeddings in embs
adj_mtx_r = np.zeros((node_num, node_num))
for v_i in range(node_num):
for v_j in range(node_num):
if v_i == v_j:
continue
adj_mtx_r[v_i, v_j] = np.dot(embs[v_i, :], embs[v_j, :])
Я прочитал это: http://www.scipy -lectures.org / advanced / scipy_sparse / storage_schemes.html
Ниже приведена моя попытка создать разреженную матрицу с той же арифметикой, что и в приведенном выше кодовом блоке. Мой вопрос: дает ли это те же результаты, что и выше :
#Get the row indices of the non-zero matrix entries
row = np.nonzero(train_edge_embs)[0]
#Get the column indices of the non-zero matrix entries
col = np.nonzero(train_edge_embs)[1]
#Get the non-zero values of the matrix entries
data = train_edge_embs[np.nonzero(train_edge_embs)]
test_mtx = sp.coo_matrix((data, (row, col)), (len(data), len(data)))
estimated_adj = test_mtx.tocsr()
Я в конечном итоге создаю список ребер из матрицы смежности, но это не представлено в этом коде.