JUNG图 - 具有无向图和加权边的PageRank

时间:2014-10-20 16:56:41

标签: graph jung pagerank weighted edges

我在带有加权边的无向图上实现PageRank。我的 理解是因为我的图是无向的,过渡 表示边缘权重的概率将根据不同而不同 原点顶点。这是有道理的,因为概率必须总计为1 顶点的出站边,但边的每个入射顶点都会 有不同的要求,这意味着我不能有一个共同的过渡 他们之间的概率。 (如果这种理解是错误的,请 纠正我。)

但是,我在实现这个方面遇到了麻烦,因为测试和文档中的示例只使用简单的边权重,而我需要键入权重的VertexEdge对(我认为)。当替换标准的Integer键控edgeweights时,VEPair类会抛出空指针异常。

语义如下:

我创建了一个UndirectedSparseGraph,我添加了顶点0,1,2,3。

g.addVertex(0);
g.addVertex(1);
g.addVertex(2);
g.addVertex(3);

然后到图表,我添加边0,1,2,3。链接顶点0 => 1 1 => 2 2 => 3 3 => 0 ie,

g.addEdge(0, 0, 1); 
g.addEdge(1, 1, 2); 
g.addEdge(2, 2, 3); 
g.addEdge(3, 3, 0);

我为每个顶点添加相等的边缘权重0.5。

map.put(0, 0.5);
map.put(1, 0.5);
map.put(2, 0.5);
map.put(3, 0.5);

我使用图表,变换边权重和0的alpha来实例化PageRank,即:

pr = new PageRank(g, MapTransformer.getInstance(map), 0);

现在,每个顶点得分都是0.25,这是正确的,即:

pr.getVertexScore(0); // 0.25
pr.getVertexScore(1); // 0.25

我的问题是,我不能仅仅在边缘上有边缘权重,因为图形是无向的。边缘的权重必须根据原点顶点而有所不同,因为顶点的所有出站边缘的边缘权重必须等于1.所以我需要一种方法,不要说边缘0的权重为x,而是边缘0对于顶点0,权重为x,对于顶点1,权重为y。

所以,我认为可以在我的maptransformer中使用VEPair类,而不是上面的整数,即:

map.put(new VEPair(0, 0), 0.5);
map.put(new VEPair(1, 0), 0.5);
map.put(new VEPair(1, 1), 0.5);
map.put(new VEPair(2, 1), 0.5);
map.put(new VEPair(2, 2), 0.5);
map.put(new VEPair(3, 2), 0.5);
map.put(new VEPair(3, 3), 0.5);
map.put(new VEPair(0, 3), 0.5);

所以,sematics是相同的,我只是明确指定给定原点顶点的每条边的权重。

调用pr.evaluate()会导致PageRankWithPriors.update()的第87行出现空指针异常

该代码特别试图获得指定的第一个边权重,并且它是空的。

请注意,仅使用来自apache.commons的普通旧MapTransformer以及VEPairs作为键将始终导致空值,因为VEPair类尚未实现hashCode或equals。所以VEPair(0,0)不等于VEPair(0,0)。我是否只需要覆盖此类并提供相等语义以使其工作?或者我完全使用错误的方法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

VEPair并不适合外部使用。它在内部几乎用于处理常见情况(无向图,其边权重是隐式均匀的)。

我看到你已经有了一个可能适合你的解决方案,但是如果你想要一个不需要你创建一个新的DirectedGraph的解决方案,你可以覆盖PageRank的getEdgeWeight(V,E)方法(已实现)在AbstractIterativeScorer中)根据无向边权重做任何你想做的事。