![](/img/trans.png)
[英]Java: Class not found for PageRank algorithm in Apache Hadoop
[英]how to test PageRank algorithm for jung?
我正在尝试测试jung的Pagerank算法,但似乎这样做有问题。 我用这部分代码创建了一个加权和间接图:
private static String getId(int nodeId)
{
return "Node " + nodeId;
}
private static String getId(int nodeId, int neighborId)
{
return "Edge " + nodeId + " -> " + neighborId;
}
public static Graph<String, Integer> createGraphForPageRank(String graphId, double[][] adjacencyMatrix)
{
Graph<String,Integer> g = new UndirectedSparseGraph <String,Integer>();
for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
g.addVertex(getId(nodeId));
for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
for (int neighborId = 0; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
if (adjacencyMatrix[nodeId][neighborId]>0)
g.addEdge(neighborId,getId(nodeId),getId(neighborId));
return(g);
}
然后,在主类中,我使用以下代码来测试图形上的pagerank:
double[][] adjacencyMatrixForPageRank =FileHelper.calculateSimilaritySentences("E:\\my workspace\\TweetsAnalyser2\\outputFiles\\splittedStemmeredFile-1.txt","");
Graph<String,Integer> g2=FileHelper.createGraphForPageRank("MyGraphForPageRank",adjacencyMatrixForPageRank);
PageRank<String,Integer> pagerank= new PageRank<String,Integer>(g2,alpha1);
pagerank.initialize();
pagerank.setTolerance(0.000001);
pagerank.setMaxIterations(200);
pagerank.evaluate();
但是eclipse会产生此错误:线程“ main”中的异常java.lang.IllegalArgumentException:该图中已经存在带端点的边缘4,并且不能与edu.uci.ics.jung.graph.AbstractGraph.getValidatedEndpoints(AbstractGraph。 java:93)at edu.uci.ics.jung.graph.UndirectedSparseGraph.addEdge(UndirectedSparseGraph.java:64)at edu.uci.ics.jung.graph.AbstractGraph.addEdge(AbstractGraph.java:60)at edu.uci .ics.jung.graph.AbstractGraph.addEdge(AbstractGraph.java:55)位于com.tweets.helpers.FileHelper.createGraphForPageRank(FileHelper.java:1496)位于com.tweets.test.Main.main(Main.java:105 )
我知道图形创建存在问题,但是我不知道如何解决! 有人可以帮帮我吗。
问题似乎是您定义了一个无向图 ,并且向该图添加了两次相同的节点。 一个(x,y)
形式,另一个(y,x)
-对于x
和y
的相同值。
通过仅从nodeID
而不是从0迭代内部循环来解决此问题:
for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
for (int neighborId = nodeId; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
^^^
此外:
g.addEdge(neighborId,getId(nodeId),getId(neighborId));
您的边缘ID不是唯一的,我认为应该是唯一的,但是我对API不够熟悉,无法确定。
有几个问题导致您出错。
(1)正如@amit所观察到的,由于图形是无向的,因此您无需在x到y之间添加一条边,而在y到x之间添加另一边。 但是,如果您具有以下代码:
g.addEdge(edgeId, x, y);
...
g.addEdge(edgeId, y, x);
对addEdge()的第二次调用将被忽略,这很好。
(2)您不能为不同的事件节点集重用边缘ID; 这就是该错误消息告诉您的内容。 边缘对象(和节点对象)类似于映射键:它们必须是唯一的。
您的代码表明您实际上并不关心边缘对象本身,这意味着您可以只创建Graph<String, Object>
并在添加边缘时执行此操作:
g.addEdge(new Object(), x, y);
在JUNG的下一个版本中,这将变得更加容易,我希望它将在几个月后发布。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.