记录一下美化args输出的模板
from texttable import Texttable
def tab_printer(args):
"""
Function to print the logs in a nice tabular format.
:param args: Parameters used for the model.
"""
args = vars(args)
keys = sorted(args.keys())
t = Texttable()
tt=[["Parameter", "Value"]]
tt1=[[k.replace("_", " ").capitalize(), args[k]] for k in keys]
tt.extend(tt1)
print(tt)
# t.add_rows([[k.replace("_", " ").capitalize(), args[k]] for k in keys])
t.add_rows(tt)
print(t.draw())
tab_printer(args)
+------------+--------------------------------+
| Parameter | Value |
+============+================================+
| Alpha | 0.010 |其他层的折扣系数
+------------+--------------------------------+
| Attributes | None |保存节点属性的numpy矩阵的文件
+------------+--------------------------------+
| Attrvals | 2 |属性值的数量。仅在生成人工属性时使用
+------------+--------------------------------+
| Buckets | 2 |作为节点特征的度binning的log基础
+------------+--------------------------------+
| Dimensions | 128 |
+------------+--------------------------------+
| Gammaattr | 1 |属性相似度的权重
+------------+--------------------------------+
| Gammastruc | 1 |结构相似度的权重
+------------+--------------------------------+
| Input | data/arenas_combined_edges.txt |组合输入图的边列表
+------------+--------------------------------+
| K | 10 |控制要采样的基准点。 默认值为 10。
+------------+--------------------------------+
| Numtop | 10 |使用kd-tree计算的最高相似度数。如果为 0,则计算所有成对相似度。
+------------+--------------------------------+
| Output | emb/arenas990-1.emb |嵌入路径
+------------+--------------------------------+
| Untillayer | 2 |直到xNetMF层的计算
+------------+--------------------------------+
true_alignments(实为packle文件)读入数据集(应该是1135长的邻接链表)
当前不考虑节点属性
记录一下nx画图的模板
import matplotlib
import matplotlib.pyplot as plt
nx.draw(nx_graph,
pos = nx.shell_layout(nx_graph), # pos 指的是布局,主要有spring_layout,random_layout,circle_layout,shell_layout
node_color = 'b', # node_color指节点颜色,有rbykw,同理edge_color
edge_color = 'r',
with_labels = True, # with_labels指节点是否显示名字
font_size =2, # font_size表示字体大小,font_color表示字的颜色
node_size =1, # font_size表示字体大小,font_color表示字的颜色
# style="dashed"
)
plt.savefig("network.png")
nx.write_gexf(nx_graph, 'network.gexf') # gexf格式文件可以导入gephi中进行分析
plt.show()
这里节点太多,画出来效果不好就算了。。。
通过nx得到输入图的邻接矩阵2270x2270
分别定义Graph和RepMethod的实例graph, rep_method,通过xnetmf.get_representations得到表示
# 节点身份提取 feature_matrix = get_features(graph, rep_method, verbose)
khop_neighbors_nobfs = get_khop_neighbors(graph, rep_method)
得到0,1,2跳的邻接链表字典,第一层key是所有2270个节点,第二层key为0,1,2表示跳数,0的value为节点本身,1,2的value为节点1,2跳邻居
得到最大度数71,特征数7从而得到特征矩阵2270x7
#基于相似度的表示 if rep_method.p is None: #p为get_feature_dimensionality计算出的采样点数 rep_method.p = get_feature_dimensionality(graph, rep_method, verbose = verbose) #k*log(n), where k = 10 elif rep_method.p > graph.N: print("Warning: dimensionality greater than number of nodes. Reducing to n") rep_method.p = graph.N landmarks = get_sample_nodes(graph, rep_method, verbose = verbose) #将所有节点索引随机打乱后采样前p个 C = np.zeros((graph.N,rep_method.p)) for node_index in range(graph.N): for landmark_index in range(rep_method.p): C[node_index,landmark_index] = compute_similarity(graph, rep_method, feature_matrix[node_index], feature_matrix[landmarks[landmark_index]], graph.node_attributes, (node_index, landmarks[landmark_index])) #其实就是计算feature_matrix[node_index] #和feature_matrix[landmarks[landmark_index]] #两个向量的欧氏距离d, #然后再计算exp(-d)作为C的元素, #C 2270x111 W_pinv = np.linalg.pinv(C[landmarks]) #求C[landmarks]这个111x111的矩阵的伪逆 U,X,V = np.linalg.svd(W_pinv) Wfac = np.dot(U, np.diag(np.sqrt(X))) reprsn = np.dot(C, Wfac) #得到CU[√X]
经过标准化得到表示
将表示对半劈开得到两个嵌入,于是采用余弦相似度或者欧氏距离算得两嵌入相似度,得到1135x1135的对齐矩阵
最后通过score_alignment_matrix比对对齐矩阵的准确情况
(总结,这个代码的作用大致就是把原图整出一个对齐版本,基本是数学方法,更是和优化、神经网络、图分类直接关系不大,算是给图分类任务提供一个思想方法吧)