繁体   English   中英

如何测试Jung的PageRank算法?

[英]how to test PageRank algorithm for jung?

我正在尝试测试jung的Pagerank算法,但似乎这样做有问题。 我用这部分代码创建了一个加权和间接图:

private static String getId(int nodeId) 
    {
        return "Node " + nodeId;
    }

    private static String getId(int nodeId, int neighborId) 
    {
        return "Edge " + nodeId + " -> " + neighborId;
    }


public static Graph<String, Integer> createGraphForPageRank(String graphId, double[][] adjacencyMatrix) 
        {
         Graph<String,Integer> g = new UndirectedSparseGraph <String,Integer>();

            for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
                g.addVertex(getId(nodeId));



            for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
                for (int neighborId = 0; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
                    if (adjacencyMatrix[nodeId][neighborId]>0)

                     g.addEdge(neighborId,getId(nodeId),getId(neighborId));



            return(g);

       }

然后,在主类中,我使用以下代码来测试图形上的pagerank:

double[][] adjacencyMatrixForPageRank =FileHelper.calculateSimilaritySentences("E:\\my workspace\\TweetsAnalyser2\\outputFiles\\splittedStemmeredFile-1.txt","");
    Graph<String,Integer> g2=FileHelper.createGraphForPageRank("MyGraphForPageRank",adjacencyMatrixForPageRank);
    PageRank<String,Integer> pagerank= new PageRank<String,Integer>(g2,alpha1);
    pagerank.initialize(); 
    pagerank.setTolerance(0.000001);
    pagerank.setMaxIterations(200);
    pagerank.evaluate();

但是eclipse会产生此错误:线程“ main”中的异常java.lang.IllegalArgumentException:该图中已经存在带端点的边缘4,并且不能与edu.uci.ics.jung.graph.Abs​​tractGraph.getValidatedEndpoints(AbstractGraph。 java:93)at edu.uci.ics.jung.graph.UndirectedSparseGraph.addEdge(UndirectedSparseGraph.java:64)at edu.uci.ics.jung.graph.Abs​​tractGraph.addEdge(AbstractGraph.java:60)at edu.uci .ics.jung.graph.Abs​​tractGraph.addEdge(AbstractGraph.java:55)位于com.tweets.helpers.FileHelper.createGraphForPageRank(FileHelper.java:1496)位于com.tweets.test.Main.main(Main.java:105 )

我知道图形创建存在问题,但是我不知道如何解决! 有人可以帮帮我吗。

问题似乎是您定义了一个无向图 ,并且向该添加了两次相同的节点。 一个(x,y)形式,另一个(y,x) -对于xy的相同值。

通过仅从nodeID而不是从0迭代内部循环来解决此问题:

for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
   for (int neighborId = nodeId; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
                         ^^^

此外:

g.addEdge(neighborId,getId(nodeId),getId(neighborId));

您的边缘ID不是唯一的,我认为应该是唯一的,但是我对API不够熟悉,无法确定。

有几个问题导致您出错。

(1)正如@amit所观察到的,由于图形是无向的,因此您无需在x到y之间添加一条边,而在y到x之间添加另一边。 但是,如果您具有以下代码:

g.addEdge(edgeId, x, y);
...
g.addEdge(edgeId, y, x);

对addEdge()的第二次调用将被忽略,这很好。

(2)您不能为不同的事件节点集重用边缘ID; 这就是该错误消息告诉您的内容。 边缘对象(和节点对象)类似于映射键:它们必须是唯一的。

您的代码表明您实际上并不关心边缘对象本身,这意味着您可以只创建Graph<String, Object>并在添加边缘时执行此操作:

g.addEdge(new Object(), x, y);

在JUNG的下一个版本中,这将变得更加容易,我希望它将在几个月后发布。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM