2013-10-14 3 views
0

"PageRankWithPriors class"에 JUNG 라이브러리를 사용하고 있습니다. 이 클래스를 테스트하기 위해 매우 작은 그래프 (노드가 3 개)를 사용했습니다. 셀프 에지를 가진 노드가없는 경우 출력은 OK이지만 그래프에 셀프 에지가있는 노드가 있으면 출력이 잘못됩니다 (노드의 최종 순위는 확률 값의 형태가 아니며 그 합은 1과 같지 않음). 출력은 : JUNG 라이브러리의 PersonalizedPageRank 클래스에 버그가 있습니까?

0.1918465227817746

0.2997601918465228

0.1247002398081535

제가 사용 "setHyperedgesAreSelfLoops (TRUE)"그러나 출력은 여전히 ​​정확 :

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()으로 전화하는 이유가 확실하지 않습니다. 조금 파고 들면 결과 값이 이상하게 보입니다. 그 방법이 호출 될 때 그래프가 하이퍼 그래프가 아닐 가능성을 지키지 않기 때문입니다. 죄송합니다. 그 동안 그래프가 하이퍼 그래프가 아닌 경우에는 호출하지 마십시오. :)

(2) 나는이 문제가 될 수 있다고 생각 : 나는 정수 0을 주조 (또는 다른 정수하는) new Integer(0) 또는 Integer.valueOf(0) 같은 일이 아니라고 생각

g.addVertex((Integer)0);

. 당신이하고있는 일은 실제로 Number 0을 Integer 레퍼런스로 변환하는 것입니다. 그래서 그래프에 몇 개의 꼭지점이 있는지 물어 보면 '3'이 아니라 '6'이됩니다.

좋은 소식은 addEdge()이 필요에 따라 그래프에 정점 인수를 자동으로 추가하기 때문에 addVertex() 호출을 완전히 제거 할 수 있다는 것입니다.

+0

나는 당신의 제안을 테스트했지만 "((Integer) 0)"은 문제가되지 않습니다! – user2880168

+0

당신은 무엇을 바꾸었고 그 효과는 무엇입니까? –

+0

1) 아무 것도 바꾸지 않고 정점의 수가 3이 아닌 3입니다. 2) "(Integer) 0"을 "new Integer (0)"로 변경했지만 결과는 이전과 동일합니다. – user2880168