PageRank

PageRank算法用于衡量网页的重要性。它通过分析超链接,认为链接到某网页的数量和质量可以表明该网页的重要性。网页获得的链接越多,它的排名越高,同时,链接来源的权重也会影响最终的PageRank分数。PageRank组件能够输出各节点的权重。

算法说明

PageRank算法是一种基于链接分析的方法,用于评估网页的相对重要性。核心原则如下:

  • 如果一个网页被众多其他网页所链接,那么它通常被认为是更重要或质量更高的资源。

  • 算法不仅计算指向该网页的链接数量,还考虑了每个链接网页本身的权重,即这些网页本身的PageRank值,以及它们指向其他网页的链接数。

在用户构成的社交网络中,PageRank理念同样适用。用户的影响力不仅由其个人属性决定,也受到其社交联系的质量的影响。例如,在新浪微博中,一个用户对其粉丝群体的影响力会受到和粉丝之间关系密切程度的影响,与用户关系较亲近的家人、同学、同事等通常会受到更大的影响。在这种人际网络模型中,边的权重反映了用户之间关系的亲密程度,被视作关系强度的指标。

带链接权重的PageRank公式为:PageRank公式

  • W(i):节点i的权重。

  • C(Ai):链接权重。

  • d:阻尼系数。

  • W(A):算法迭代稳定后的节点权重,即每个用户的影响力指数。

配置组件

方法一:可视化方式

Designer工作流页面添加PageRank组件,并在界面右侧配置相关参数:

参数类型

参数

描述

字段设置

选择源顶点列

边表的起点所在列。

选择目标顶点列

边表的终点所在列。

选择边权值列

边表边的权重所在列。

参数设置

最大迭代次数

算法自身会收敛并停止迭代,默认值为30。

阻尼系数

在任意时刻,用户到达某网页后并继续向后浏览的概率。

执行调优

进程数

作业并行执行的节点数。数字越大并行度越高,但是框架通讯开销会增大。

进程内存

单个作业可使用的最大内存量,单位:MB,默认值为4096。

如果实际使用内存超过该值,会抛出OutOfMemory异常。

方法二:PAI命令方式

使用PAI命令配置PageRank组件参数。您可以使用SQL脚本组件进行PAI命令调用,详情请参见场景4:在SQL脚本组件中执行PAI命令

PAI -name PageRankWithWeight
    -project algo_public
    -DinputEdgeTableName=PageRankWithWeight_func_test_edge
    -DfromVertexCol=flow_out_id
    -DtoVertexCol=flow_in_id
    -DoutputTableName=PageRankWithWeight_func_test_result
    -DhasEdgeWeight=true
    -DedgeWeightCol=weight
    -DmaxIter 100;

参数

是否必选

默认值

描述

inputEdgeTableName

输入边表名。

inputEdgeTablePartitions

全表读入

输入边表的分区。

fromVertexCol

输入边表的起点所在列。

toVertexCol

输入边表的终点所在列。

outputTableName

输出表名。

outputTablePartitions

输出表的分区。

lifecycle

输出表的生命周期。

workerNum

未设置

作业并行执行的节点数。数字越大并行度越高,但是框架通讯开销会增大。

workerMem

4096

单个作业可使用的最大内存量,单位:MB,默认值为4096。

如果实际使用内存超过该值,会抛出OutOfMemory异常。

splitSize

64

数据切分的大小,单位:MB。

hasEdgeWeight

false

输入边表的边是否有权重。

edgeWeightCol

输入边表边的权重所在列。

maxIter

30

最大迭代次数。

使用示例

  1. 添加SQL脚本组件,去勾选使用Script模式是否由系统添加Create Table语句,并在SQL脚本中输入以下SQL语句。

    drop table if exists PageRankWithWeight_func_test_edge;
    create table PageRankWithWeight_func_test_edge as
    select * from
    (
        select 'a' as flow_out_id,'b' as flow_in_id,1.0 as weight
        union all
        select 'a' as flow_out_id,'c' as flow_in_id,1.0 as weight
        union all
        select 'b' as flow_out_id,'c' as flow_in_id,1.0 as weight
        union all
        select 'b' as flow_out_id,'d' as flow_in_id,1.0 as weight
        union all
        select 'c' as flow_out_id,'d' as flow_in_id,1.0 as weight
    )tmp;

    对应的数据结构图:

    image

  2. 添加SQL脚本组件,去勾选使用Script模式是否由系统添加Create Table语句,在SQL脚本中输入以下PAI命令,并将步骤 1和步骤 2的组件进行连线。

    drop table if exists ${o1};
    PAI -name PageRankWithWeight
        -project algo_public
        -DinputEdgeTableName=PageRankWithWeight_func_test_edge
        -DfromVertexCol=flow_out_id
        -DtoVertexCol=flow_in_id
        -DoutputTableName=${o1}
        -DhasEdgeWeight=true
        -DedgeWeightCol=weight
        -DmaxIter 100;
  3. 单击左上角image,运行工作流。

  4. 待运行结束,右键单击步骤 2的组件,选择查看数据 > SQL脚本的输出,查看训练结果。

    | node | weight     |
    | ---- | ---------- |
    | a    | 0.12841452 |
    | b    | 0.18299069 |
    | c    | 0.26076174 |
    | d    | 0.42783305 |