读REGAL实现

记录一下美化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比对对齐矩阵的准确情况
在这里插入图片描述
(总结,这个代码的作用大致就是把原图整出一个对齐版本,基本是数学方法,更是和优化、神经网络、图分类直接关系不大,算是给图分类任务提供一个思想方法吧)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值