本文参考2011年吕琳媛等发表的综述文章--Link prediction in complex networks: A survey,截止目前被引用量已达到1678次,可见该论文的影响力。
前提:链路预测只能预测边,不能预测节点。只预测边!!!
论文中提出两种链路预测的评价指标:AUC和精确度(Precision)
1、 AUC:
AUC指标的具体计算方法:
首先我们知道衡量一个算法的好坏,需要把数据集划分为训练集和测试集,如何划分?比如可以删除10%的边(只删除边),那么这10%就是测试集,其余的90%的边和网络的全部节点就为训练集。那么还有其它的边吗?我想绝大数现实的网络都不是完全图吧,所以肯定有两个节点之间没有连边的情况,那这部分边,我们称之为不存在的边。
一个算法(如CN)经过训练集训练得到网络中每一对节点之间的一个相似值(包括训练集中的边也会得到,测试集的边以及不存在的边显然也会得到)。
AUC指标就是比较测试集中的边的相似值 与 不存在的边的相似性的大小。
如果测试集中边的相似值大于不存在边的相似值,就说明效果好啊,+ 1呗;
如果测试集中边的相似值等于不存在边的相似值,就说明跟随机选择差不多啊,那就+ 0.5呗,没啥意义,还不如不用算法;
如果测试集中边的相似值小于不存在边的相似值,就说明你这算法也太差了吧,随机的都比不过,反其道行之啊兄弟,+ 0吧;
那么分母就是测试集中的边与不存在中的边的比较次数,比如测试集中2条边,不存在中3条边,那么比较次数就是6次啦。
2、 精确度(Precision)
注意:这里提到的精确度和你之前听到的二分类问题的precision、accuracy、recall、F1都毫无关系!!!
那么这种精确度怎样计算呢?
算法(如CN)不是得到每一个节点对之间的相似值了嘛,这时候去掉训练集中的边,还剩什么了?就剩测试集中的边和不存在的边以及边对应的相似值,按相似值的大小倒序排列这些边。排序后取前L个(比如给它赋值50,即L=50),看一看这里有几个是测试集中的啊,比如有20个,那么精确度就等于20/50。
那具体在编程时怎么知道这50个里面有几个是测试集中的呢?简单啊,取前50个&测试集所有的,然后再len,计算个数,分子部分就搞定了,分母就是50呗。
L的值如何设定,这是一个好问题!阅读其他论文,有的研究者选择了L=50,100,150,200,250都计算一遍,然后画了个折线图,不论L等于多少,你提出的算法的精确度比其它算法好就行呗。
以上两个评价指标就说完了,个人感觉链路预测AUC还是首选,在AUC区分不大的时候,采用精确度进一步比较,精确度这个评价指标只需要检查较少的排在前面的边就能找到更多正确的预测。
总之,AUC是最常用的,它从整体上衡量算法;精确度只考虑前多少位是否预测正确。
论文下载:https://www.neusncp.com/user/file?id=164