-
Notifications
You must be signed in to change notification settings - Fork 480
Expand file tree
/
Copy pathlap.py
More file actions
60 lines (47 loc) · 1.83 KB
/
Copy pathlap.py
File metadata and controls
60 lines (47 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import numpy as np
import networkx as nx
__author__ = "Wang Binlu"
__email__ = "wblmail@whu.edu.cn"
class LaplacianEigenmaps(object):
def __init__(self, graph, rep_size=128):
self.g = graph
self.node_size = self.g.G.number_of_nodes()
self.rep_size = rep_size
self.adj_mat = nx.to_numpy_array(self.g.G)
self.vectors = {}
self.embeddings = self.get_train()
look_back = self.g.look_back_list
for i, embedding in enumerate(self.embeddings):
self.vectors[look_back[i]] = embedding
def getAdj(self):
node_size = self.g.node_size
look_up = self.g.look_up_dict
adj = np.zeros((node_size, node_size))
for edge in self.g.G.edges():
adj[look_up[edge[0]]][look_up[edge[1]]] = self.g.G[edge[0]][edge[1]]['weight']
return adj
def getLap(self):
degree_mat = np.diagflat(np.sum(self.adj_mat, axis=1))
deg_trans = np.diagflat(np.reciprocal(np.sqrt(np.sum(self.adj_mat, axis=1))))
deg_trans = np.nan_to_num(deg_trans)
L = degree_mat-self.adj_mat
# eye = np.eye(self.node_size)
norm_lap_mat = np.matmul(np.matmul(deg_trans, L), deg_trans)
return norm_lap_mat
def get_train(self):
lap_mat = self.getLap()
w, vec = np.linalg.eigh(lap_mat)
start = 0
for i in range(self.node_size):
if w[i] > 1e-10:
start = i
break
vec = vec[:, start:start+self.rep_size]
return vec
def save_embeddings(self, filename):
fout = open(filename, 'w')
node_num = len(self.vectors)
fout.write("{} {}\n".format(node_num, self.rep_size))
for node, vec in self.vectors.items():
fout.write("{} {}\n".format(node, ' '.join([str(x) for x in vec])))
fout.close()