Я сделал метод для реализации дивергенции Кульбака-Лейблера в Java.Я использовал журнал со значением базы 2, и я не уверен, правильно ли я его использовал или мне следует использовать значение базы 10.Я использую этот метод для измерения расхождения между двумя текстовыми единицами (каждая разной длины).
Моя проблема в том, что я не получаю нужную меру дивергенции.
например, для двух текстовых блоков, а именно => "Бесплатные мелодии звонка" и второй "Бесплатные мелодии звонка для вашего мобильного телефона от PremieRingtones.com"
Я должен получить расхождение 0,25 (какиз моего проекта ссылки), но я получаю расхождение 2,0, если я использую журнал Base2 и 1,38 для журнала Base10.
Также я не знаю, какое значение заменить вместо нулевого значения для demnominator.Plz поможет дать четкое объяснение с некоторыми примерами, если это возможно, и даже с некоторыми ссылками, где я могу получить детали.
Это мой фрагмент кода:
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;
}
Мой ввод похож на это
Первая текстовая единица
list.add("Free");list.add("Ringtones");
Вторая текстовая единица
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");
Функция вызова
calculateKLD(list, list2)