4 Stimmen

Welcher Log-Wert ist für die Implementierung der Kullback-Leibler-Divergenz zu verwenden?

Ich habe eine Methode zur Implementierung der Kullback-Leibler-Divergenz in Java entwickelt. Ich habe den Log mit Basis 2 Wert verwendet und bin mir nicht sicher, ob ich ihn richtig verwendet habe oder ob ich den Log mit Basis 10 Wert verwenden sollte. Ich verwende diese Methode, um die Divergenz zwischen zwei Texteinheiten (jede mit unterschiedlicher Länge) zu messen.

Mein Problem ist, dass ich nicht das gewünschte Divergenzmaß erhalte.

zum Beispiel für zwei Texteinheiten, nämlich => "Free Ringtones" und die zweite "Free Ringtones for your Mobile Phone from PremieRingtones.com"

Ich sollte eine Divergenz von 0,25 erhalten (wie in meinen Projektreferenzen), aber ich erhalte eine Divergenz von 2,0, wenn ich log base2 verwende und 1,38 für log base10.

Auch ich bin nicht bewusst, welchen Wert anstelle von Null-Wert für demnominator.Plz Hilfe in geben klare Erklärung mit einigen Beispielen, wenn möglich und sogar einige Links, wo ich Details erhalten können.

Dies ist mein Codeschnipsel:

public Double calculateKLD(List<String> values,List<String> value2)   
{  

    Map<String, Integer> map = new HashMap<String, Integer>();  
    Map<String, Integer> map2 = new HashMap<String, Integer>();  
    for (String sequence : values)  
    {  
        if (!map.containsKey(sequence))  
        {  
            map.put(sequence, 0);
        }
        map.put(sequence, map.get(sequence) + 1);
    }

    for (String sequence : value2)  
    {  
        if (!map2.containsKey(sequence)) {
            map2.put(sequence, 0);
        }
        map2.put(sequence, map2.get(sequence) + 1);
    }

    Double result = 0.0;
    Double frequency2=0.0;
    for (String sequence : map.keySet())  
    {

        Double frequency1 = (double) map.get(sequence) / values.size();
        System.out.println("Freuency1 "+frequency1.toString());
        if(map2.containsKey(sequence))
        {

            frequency2 = (double) map2.get(sequence) / value2.size();                
        }
        result += frequency1 * (Math.log(frequency1/frequency2) / Math.log(2));         
    }  
    return result/2.4;  
}    

Mein Input sieht folgendermaßen aus

Erste Texteinheit

   list.add("Free");list.add("Ringtones");  

Zweite Texteinheit

      list2.add("Free");list2.add("Ringtones");list2.add("for");list2.add("your");list2.add("Mobiile");list2.add("Phone");list2.add("from");list2.add("PremieRingtones.com");

Aufruf der Funktion

   calculateKLD(list, list2)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X