java – 用于Kullback leibler散乱实现的日志值是什么?

我已经做了一个方法来实现
Java中的Kullback-leibler分歧.我已经使用了带有base 2值的日志,我不确定我是否使用过它,或者我应该使用log base 10值.我正在使用这种方法来测量两个文本单元(每个不同长度)之间的差异.

我的问题是我没有得到理想的分歧措施.

例如,对于两个文本单元,即=> “免费铃声”和第二个“PremieRingtones.com为您的手机免费铃声”

我应该得到0.25的差异(从我的项目引用),但如果我使用log base2和1.38用于log base10,我会得到2.0的差异.

此外,我不知道为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)

最佳答案 作为猜测,您可能希望使用log base e(即自然对数).由于K-L散度是一种统计量度,因此它的概率是根据自然对数来定义的.

点赞