gpt4 book ai didi

java - 用于 Kullback leibler 发散实现的日志值是多少?

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:18 34 4
gpt4 key购买 nike

我做了一个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 散度是一种统计量度,因此很可能它是根据自然对数定义的。

关于java - 用于 Kullback leibler 发散实现的日志值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815392/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com