PageRank算法复现踩坑

483 阅读2分钟

PageRank算法复现踩坑

简述

PageRank是用于计算网页重要性程度的一个算法,我想该算法从而转向SourceRank算法,以此来判断资源的流向,进而来判断某两字段是否有关系,在利用python来复现Pagerank时,出现了三个问题。不过都解决了,以下进行解释。

问题一:

for循环命名:

在利用for循环命名时,最初就想着利用for i in graph定义每个节点,这样既省事又方便,结果发现在定义的时候,始终报Str的错误 一方面,虽然说定义了类,但是其实最后这仍然只是一个Str,只有在for 循环内才是命名的类,命名完的节点分配地址,但是出来以后因为当时设定的‘a’,'b'等节点过于普通,所以又重新给与了地址。所以最后查到了可以利用 locals()函数。

locals函数的使用可以按照所想命名的分配地址空间,因此有较高的优先级?所以不会被轻易覆盖。如我的Graph中定义了‘a’,'b','c'节点,最终我在后期的使用中,虽然有重构,但是也不影响调用类。

问题二

传值同步

虽然最后没有用到但是也是值得我以后注意的问题,在初始化list1以后为了方便于是直接list1=list2来初始化list2 ,目的在于在list1中的结点改值以后不影响后面结点的改值,所以又初始了一个list2 但是在python里list1=list2是给与了list2以list1 的地址,所以list1 改的时候list2 也在同步变化就没有意义。

问题三

关于结点PageRank值

PR(a)=1-d+...在一开始的时候一直默认了value_init=1,所以一直就用PRa.value -=0.5,导致了后面的参数越来越奇怪,但是实际上只要在找到点以后赋值PRa.value=1-d即可就不用考虑那么多奇怪的问题


def __init__(self,graph):
    self.graph_n=graph

def count(self):
    list = {}
    #初始化
    for point_outer in self.graph_n:
        locals()['{}'.format(point_outer)] = PageRank_first.PageRank(self.graph_n, point_outer)
        # 初始化图中结点的资源度为1
        list[point_outer] = PageRank_first.PageRank(self.graph_n, point_outer)


    # 图的迭代次数
    for x in range(0, 10, 1):
            # 遍历图的所有节点#我要做图反向。
            for point_outer in self.graph_n:#遍历所有外部点A
                list[point_outer].value_num = 0.5
                for point_outer_1 in self.graph_n:#再次遍历外部点B找出度为外部点A,并赋予prg值
                    for i in self.graph_n[point_outer_1]:#在B中找是否有A点
                        if i==point_outer:#若点C是A ,给值

                            list[point_outer].value_num +=list[point_outer_1].pageRank()


                    # 当前节点i应该为分配给每个出度节点的资源度
                    # 出度不为空时遍历出度中的每个节点

    return list