我已经做了一个方法来实现
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散度是一种统计量度,因此它的概率是根据自然对数来定义的.