我正在使用JUNG库作为它的"PageRankWithPriors类"。我使用了一个非常小的图(只有 3 个节点)来测试这个类。 当没有任何具有自边的节点时,输出是正常的,但如果图包含具有自边的节点,则输出将变得不正确(节点的最终排名不是概率值的形式,它们的总和不等于 1)。输出为:
0.2997601918465228
0.1247002398081535
0.1918465227817746
我使用了"setHyperedgesAreSelfLoops(true)",但输出仍然不正确:
320751.99531359226
609574.2619040733
2554381.251484884
为什么"个性化页面排名类"无法正常工作?里面有错误还是我做错了什么?
我的代码是:
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));
}
非常感谢您的帮助。
(1) 我不确定你为什么要调用setHyperEdgesAreSelfLoops()
,因为你不是在处理超图。 稍微挖掘一下,看起来结果数字很奇怪,因为我们没有防范在调用该方法时图不是超图的可能性。 哎呀。 同时,如果你的图不是超图,就不要这么称呼它。 :)
(2)我认为这可能是问题所在:
g.addVertex((Integer)0);
我相信将 0(或任何其他整数)转换为整数与 new Integer(0)
或 Integer.valueOf(0)
不是一回事。 您正在做的实际上是将数字 0 强制转换为整数引用。 所以我敢打赌,如果你问你的图有多少个顶点,它会报告"6"而不是"3"。
好消息是,addEdge()
将根据需要自动将顶点参数添加到图形中,因此您可以完全删除addVertex()
调用。