какое значение журнала использовать для реализации расхождения Kullback leibler? - PullRequest
4 голосов
/ 27 января 2011

Я сделал метод для реализации дивергенции Кульбака-Лейблера в 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)

1 Ответ

2 голосов
/ 27 января 2011

В качестве предположения, вы, вероятно, захотите использовать базу журналов e (то есть натуральный логарифм). Поскольку K-L дивергенция является статистической мерой, вероятнее всего, она определяется в терминах натуральных логарифмов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...