【问题标题】:Does PersonalizedPageRank class in JUNG library have bug?JUNG 库中的 PersonalizedPageRank 类是否有错误?
【发布时间】:2013-10-14 19:45:21
【问题描述】:

我将 JUNG 库用于其“PageRankWithPriors 类”。我使用了一个非常小的图表(只有 3 个节点)来测试这个类。当没有任何具有自边缘的节点时,输出是可以的,但是如果图中包含具有自边缘的节点,则输出变得不正确(节点的最终排名不是概率值的形式,它们的总和是不等于 1)。输出是:

0.2997601918465228

0.1247002398081535

0.1918465227817746

我使用了“setHyperedgesAreSelfLoops(true)”,但输出仍然不正确:

320751.99531359226

609574.2619040733

2554381.251484884

为什么“PersonalizedPageRank 类”不能正常工作?里面有bug还是我做错了什么?

我的代码是:

public static void main(String[] args) throws FileNotFoundException, IOException 
{           
   weigth[0][1]=0.2;
   weigth[0][2]=0.8;
   weigth[1][0]=1;
   weigth[2][1]= 0.5;
   weigth[2][2]= 0.5;       

   prior[0]=1;
   prior[1]=0;
   prior[2]=0;

   Graph<Integer, String> g = new DirectedSparseGraph<Integer, String> ();

   g.addVertex(new Integer(0));
   g.addVertex(new Integer(1));
   g.addVertex(new Integer(2));

   g.addEdge("0->1", 0, 1, EdgeType.DIRECTED);
   g.addEdge("0->2", 0, 2, EdgeType.DIRECTED);
   g.addEdge("1->0", 1, 0, EdgeType.DIRECTED);
   g.addEdge("2->1", 2, 1, EdgeType.DIRECTED);
   g.addEdge("2->2", 2, 2, EdgeType.DIRECTED);


   Transformer<String, Double> edge_weigths = 
           new Transformer<String, Double>()
           {
        @Override
                public Double transform(String e) 
                {
                    String[] split = e.split("->");           
                    return weigth[Integer.parseInt(split[0])][Integer.parseInt(split[1])];
                }           
           };

   Transformer<Integer, Double> vertex_prior = 
           new Transformer<Integer, Double>()
           {            
        @Override
                public Double transform(Integer v) 
                {                        
                    return prior[v];            
                }           
           }


   PageRankWithPriors prp = new PageRankWithPriors(g, edge_weigths, vertex_prior, 0.2);        
   prp.setHyperedgesAreSelfLoops(true);   
   prp.evaluate();

   System.out.println(prp.getVertexScore(0));
   System.out.println(prp.getVertexScore(1));
   System.out.println(prp.getVertexScore(2));   


}

非常感谢您的帮助。

【问题讨论】:

    标签: jung pagerank jung2


    【解决方案1】:

    (1) 我不知道你为什么打电话给setHyperEdgesAreSelfLoops(),因为你没有使用超图。深入研究一下,结果数字看起来很奇怪,因为当调用该方法时,我们并没有防范图不是超图的可能性。哎呀。同时,如果您的图不是超图,请不要调用它。 :)

    (2) 我认为这可能是问题所在:

    g.addVertex((Integer)0);

    我相信将 0(或任何其他整数)转换为 Integer 与 new Integer(0)Integer.valueOf(0) 不同。您所做的实际上是将数字 0 转换为 Integer 引用。所以我敢打赌,如果你问你的图有多少个顶点,它会报告“6”而不是“3”。

    好消息是addEdge() 会根据需要自动将顶点参数添加到图形中,因此您可以完全删除addVertex() 调用。

    【讨论】:

    • 我测试了你的建议,但“((整数)0)”不是问题!
    • 你做了什么改动,效果如何?
    • 1) 不做任何改变,顶点数是 3 而不是 6。 2) 我将“(Integer)0”改为“new Integer(0)”,但结果和以前一样。
    • 有趣。啊,我想我可能已经发现了问题。尝试移除自环并使其成为不同的边缘。我认为代码有一个自循环错误。 (具有讽刺意味的是。)
    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多