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)