2013-10-14 32 views
0

我爲其「PageRankWithPriors類」使用JUNG庫。我用一個非常小的圖(只有3個節點)來測試這個類。當沒有任何具有自我邊緣的節點時,輸出是可以的,但是如果圖形包含具有自我邊緣的節點,則輸出變得不正確(節點的最終等級不是以概率值的形式並且它們的和是不等於1)。輸出爲:JUNG庫中的PersonalizedPageRank類有bug嗎?

0.2997601918465228

0.1247002398081535

0.1918465227817746

我用 「setHyperedgesAreSelfLoops(真)」,但輸出仍然不正確:

320751.99531359226

609574.2619040733

2554381.251484884

爲什麼「PersonalizedPageRank類」無法正常工作?它內部是否有錯誤或者我做錯了什麼?

我的代碼是:

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)); 


} 

你的幫助是極大的讚賞。

回答

0

(1)我不確定你爲什麼打電話給setHyperEdgesAreSelfLoops(),因爲你沒有使用超圖。挖掘一下,看起來結果數字很奇怪,因爲我們沒有防止該方法被調用時圖形不是超圖的可能性。哎呀。同時,如果你的圖表不是Hypergraph,那麼不要這麼稱呼。 :)

(2)我認爲這可能是問題:

g.addVertex((Integer)0);

我相信,鑄造0(或任何其他的整數)爲整型是不一樣的東西new Integer(0)Integer.valueOf(0)。你在做什麼實際上將數字0轉換爲Integer引用。所以我敢打賭,如果你問你的圖有多少個頂點,它會報告'6'而不是'3'。

好消息是addEdge()會根據需要自動將頂點參數添加到圖中,因此您可以完全刪除addVertex()調用。

+0

我測試了你的建議,但「((Integer)0)」不是問題! – user2880168

+0

你改變了什麼,效果如何? –

+0

1)不改變任何東西的頂點數是3而不是6. 2)我改變了「(整數)0」到「新的整數(0)」,但結果與以前一樣。 – user2880168