zoukankan      html  css  js  c++  java
  • PageRank算法

    PageRank算法是随机游走问题,是一道求解线性方程组问题。

    它的输入是:一个邻接矩阵,每行的和为1,a[i][j]表示第i个元素去往第j个元素的概率。

    它的输出是:一个分值list,第i个分值表示第i个元素的得分

    PageRank实际上提供了一种排序方法,可以根据元素共现矩阵来决定每个元素的分值。这种方法像贝叶斯公式一样具有普遍意义。

    • 网页之间的链接构成邻接矩阵
    • 在文本中词和词在同一个句子中出现形成共现矩阵

    PageRank有两种解法:

    • 求解线性方程组:准确解法
    • 迭代解法:适合于稀疏矩阵
    import numpy as np
    
    
    def iterate_method(a):
        score = np.ones((2, len(a))) / len(a)
        while 1:
            score[1] = np.matmul(a, score[0])
            score[1] /= np.sum(score[1])
            eps = np.sum(np.abs(score[0] - score[1]))
            score[0] = score[1] / np.sum(score[1])
            if eps < 1e-5:
                break
        return score[0]
    
    
    def linear_equation(a):
        A = a.copy()
        A -= np.eye(len(A))
        A[-1] = np.ones(len(A))
        b = np.zeros(len(A))
        b[-1] = 1
        x = np.linalg.solve(A, b)
        return x
    
    
    def main():
        a = np.random.random((10, 10))
        a /= np.sum(a, axis=1)  # 每个结点去往其它结点的概率之和应该为1
        score1 = linear_equation(a)
        score2 = iterate_method(a)
        print(score1)
        print(score2)
        print(np.argsort(score1))
        print(np.argsort(score2))
    
    
    main()
    
    
  • 相关阅读:
    StrBlobPtr类——weak_ptr访问vector元素
    StrBlob类——智能指针作为成员
    关于智能指针类型shared_ptr的计数问题
    桌面计算器——可调用对象练习
    union
    虚析构函数
    条款04 确定对象被使用前已先被初始化
    条款03 尽可能使用const
    Bugku-CTF之web8(txt????)
    Bugku-CTF之各种绕过
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9895325.html
Copyright © 2011-2022 走看看