Java Kullback-leibler分歧实现使用什么日志值?

Java Kullback-leibler分歧实现使用什么日志值?,java,algorithm,math,nlp,Java,Algorithm,Math,Nlp,我已经用java实现了Kullback-leibler分歧。我使用了以2为基数的日志,我不确定我是否正确使用了它,还是应该使用以10为基数的日志。我使用这种方法来测量两个文本单位(每个长度不同)之间的差异 我的问题是我没有得到期望的散度度量 例如,对于两个文本单位,即=>“免费铃声”和第二个“PremieRingtones.com为您的手机提供免费铃声” 我应该得到0.25的偏差(在我的项目参考中),但是如果我使用log base2和1.38作为log base10,我会得到2.0的偏差 另外,

我已经用java实现了Kullback-leibler分歧。我使用了以2为基数的日志,我不确定我是否正确使用了它,还是应该使用以10为基数的日志。我使用这种方法来测量两个文本单位(每个长度不同)之间的差异

我的问题是我没有得到期望的散度度量

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

我应该得到0.25的偏差(在我的项目参考中),但是如果我使用log base2和1.38作为log base10,我会得到2.0的偏差

另外,我不知道用什么值来代替demnominator的零值。如果可能的话,请用一些例子来帮助我给出清晰的解释,甚至可以通过一些链接来获取详细信息

这是我的代码片段:

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)

作为猜测,您可能希望使用对数基数e(即自然对数)。由于K-L散度是一种统计度量,很有可能它是根据自然对数定义的。

使用不同的对数将产生比例值。对于log2,我们说散度是用位表示的,对于nats中的自然对数和log10,我不知道任何术语,但通常在乘以10后以分贝结束。它们是真正的单位,它们之间有一个恒定的转换系数,比如米和英里,磅和公吨,等等。如果你使用log256,你会得到0.25。看起来你的计算是正确的。当我手动计算它时,我得到2.0。如果你换个角度,做D|KL(Q | | | P),我得到-0.5。为什么你要写“
map.put(sequence,0);
”而不是“
map.put(sequence,1);
”?做信息论的人使用base 2 log,这会产生以位为单位的解释结果。