"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));
}
당신의 도움이 크게 감사합니다.
나는 당신의 제안을 테스트했지만 "((Integer) 0)"은 문제가되지 않습니다! – user2880168
당신은 무엇을 바꾸었고 그 효과는 무엇입니까? –
1) 아무 것도 바꾸지 않고 정점의 수가 3이 아닌 3입니다. 2) "(Integer) 0"을 "new Integer (0)"로 변경했지만 결과는 이전과 동일합니다. – user2880168