Есть ли ошибка в классе PersonalizedPageRank в библиотеке JUNG?

Я использую библиотеку JUNG для своего «класса PageRankWithPriors». Я использовал очень маленький граф (всего 3 узла) для тестирования этого класса. когда нет ни одного узла с собственным ребром, вывод в порядке, но если граф содержит узел с собственным ребром, вывод становится неверным (окончательный ранг узлов не в виде значения вероятности, и их сумма равна не равно 1). вывод:

0.2997601918465228

0.1247002398081535

0.1918465227817746

я использовал «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));   


}

ваша помощь очень ценится.


person user2880168    schedule 14.10.2013    source источник


Ответы (1)


(1) Я не знаю, почему вы звоните setHyperEdgesAreSelfLoops(), поскольку вы не работаете с гиперграфом. Если немного углубиться, получается, что результирующие числа странные, потому что мы не защищаемся от возможности того, что график не является гиперграфом при вызове этого метода. Упс. А пока не называйте это, если ваш график не является гиперграфом. :)

(2) Я думаю, что это может быть проблемой:

g.addVertex((Integer)0);

Я считаю, что приведение 0 (или любого другого целого числа) к целому числу — это не то же самое, что new Integer(0) или Integer.valueOf(0). То, что вы делаете, на самом деле приводит число 0 к ссылке Integer. Так что держу пари, что если вы спросите свой граф, сколько у него вершин, он сообщит «6», а не «3».

Хорошей новостью является то, что addEdge() автоматически добавит аргументы вершины к графу по мере необходимости, так что вы можете просто полностью удалить вызовы addVertex().

person Joshua O'Madadhain    schedule 15.10.2013
comment
я проверил ваше предложение, но ((Integer)0) не проблема! - person user2880168; 16.10.2013
comment
Что вы изменили и каков был эффект? - person Joshua O'Madadhain; 17.10.2013
comment
1) без каких-либо изменений количество вершин равно 3, а не 6. 2) я изменил (целое число) 0 на новое целое число (0), но результаты были такими же, как и раньше. - person user2880168; 17.10.2013
comment
Интересный. А, кажется, я заметил проблему. Попробуйте удалить петлю и сделать ее другим краем. Я думаю, что в коде есть ошибка для циклов. (Достаточно иронично.) - person Joshua O'Madadhain; 17.10.2013