美文网首页
PersonalRank

PersonalRank

作者: thqby | 来源:发表于2020-12-09 13:06 被阅读0次

    1. PersonalRank的产生背景

        PersonalRank产生于用户浏览网页的行为的场景,受pageRank算法的启发,是一种基于图的搜索算法,同时也可以将用户浏览网页的行为看成是用户浏览物品的行为,这样就可以针对用户接下来最可能浏览的物品做推荐。

    2. PersonalRank的特点

         2.1. 图结构

         2.2 PageRank

    3. PersonalRank的网络结构

        

        上图为盗图

    4. PersonalRank的算法

        这里依旧不说话,默默上公式:

        

    从上述式子看到了一个很有意思的事情,就拿节点游走这件事来说,将各个节点看作一个人,将可能性比作重要性,从A节点到B节点的可能性即是A对B的重要性,类比映射即是,自己认为自己行不算,得别人说自己行才行,别人还得不是那种见谁都夸的人(别人的出度很大),还得说自己行的那个人行才行(别人的PR值大)。那么对应公式就是PR(B)的值的大小取决于:别人的出度大小、别人的重要性大小、别人夸自己的概率。哈哈哈,编不下去了...

    5. PersonalRank的代码

    # coding=utf-8

    __author__ = 'orisun'

    import time

    import operator

    def PersonalRank(G, alpha, root, max_step):

        rank = dict()

        rank = {x: 0 for x in G.keys()}

        rank[root] = 1

        # 开始迭代

        begin = time.time()

        for k in range(max_step):

            tmp = {x: 0 for x in G.keys()}

            # 取节点i和它的出边尾节点集合ri

            for i, ri in G.items():

                # 取节点i的出边的尾节点j以及边E(i,j)的权重wij, 边的权重都为1,归一化之后就上1/len(ri)

                for j, wij in ri.items():

                    # i是j的其中一条入边的首节点,因此需要遍历图找到j的入边的首节点,

                    # 这个遍历过程就是此处的2层for循环,一次遍历就是一次游走

                    tmp[j] += alpha * rank[i] / (1.0 * len(ri))

                    #####上面这样也是没问题的,本次游走不需要游走的计算了和它相邻的游走节点的 rank[i]也为0,这样计算得到它的结果还是0,并不影响实际游走动作;

            # 我们每次游走都是从root节点出发,因此root节点的权重需要加上(1 - alpha)

            tmp[root] += (1 - alpha)

            rank = tmp

        end = time.time()

        print('use time', end - begin)

        li = sorted(rank.items(), reverse=True)

        for ele in li:

            print("%s:%.3f, \t" % (ele[0], ele[1]))

        return rank

    if __name__ == '__main__':

        alpha = 0.8

        G = {'A': {'a': 1, 'c': 1},

            'B': {'a': 1, 'b': 1, 'c': 1, 'd': 1},

            'C': {'c': 1, 'd': 1},

            'a': {'A': 1, 'B': 1},

            'b': {'B': 1},

            'c': {'A': 1, 'B': 1, 'C': 1},

            'd': {'B': 1, 'C': 1}}

        PersonalRank(G, alpha, 'b', 50)  # 从'b'节点开始游走

    代码执行结果如下:

    可以看到B节点为接下来最有可能游走的节点。

    6.参考文献

    https://www.cnblogs.com/zhangchaoyang/articles/5470763.html#mjx-eqn-pr

    相关文章

      网友评论

          本文标题:PersonalRank

          本文链接:https://www.haomeiwen.com/subject/vihhgktx.html