我爲其「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));
}
你的幫助是極大的讚賞。
我測試了你的建議,但「((Integer)0)」不是問題! – user2880168
你改變了什麼,效果如何? –
1)不改變任何東西的頂點數是3而不是6. 2)我改變了「(整數)0」到「新的整數(0)」,但結果與以前一樣。 – user2880168