- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经关注论文here和代码 here (它是使用对称 kld 和论文中第一个链接中提出的退避模型实现的)用于计算两个文本数据集之间的 KLD。我在最后更改了 for 循环以返回两个数据集的概率分布,以测试两者之和是否为 1:
import re, math, collections
def tokenize(_str):
stopwords = ['and', 'for', 'if', 'the', 'then', 'be', 'is', \
'are', 'will', 'in', 'it', 'to', 'that']
tokens = collections.defaultdict(lambda: 0.)
for m in re.finditer(r"(\w+)", _str, re.UNICODE):
m = m.group(1).lower()
if len(m) < 2: continue
if m in stopwords: continue
tokens[m] += 1
return tokens
#end of tokenize
def kldiv(_s, _t):
if (len(_s) == 0):
return 1e33
if (len(_t) == 0):
return 1e33
ssum = 0. + sum(_s.values())
slen = len(_s)
tsum = 0. + sum(_t.values())
tlen = len(_t)
vocabdiff = set(_s.keys()).difference(set(_t.keys()))
lenvocabdiff = len(vocabdiff)
""" epsilon """
epsilon = min(min(_s.values())/ssum, min(_t.values())/tsum) * 0.001
""" gamma """
gamma = 1 - lenvocabdiff * epsilon
""" Check if distribution probabilities sum to 1"""
sc = sum([v/ssum for v in _s.itervalues()])
st = sum([v/tsum for v in _t.itervalues()])
ps=[]
pt = []
for t, v in _s.iteritems():
pts = v / ssum
ptt = epsilon
if t in _t:
ptt = gamma * (_t[t] / tsum)
ps.append(pts)
pt.append(ptt)
return ps, pt
我测试过
d1 = """许多研究出版物希望您使用 BibTeX,哪个更好
组织整个过程。为了具体起见,假设您的来源
文件是 x.tex。基本上,您创建一个文件 x.bib 包含
引用书目,然后在该文件上运行 bibtex。"""
d2 = """在这种情况下,您必须同时提供\left 和\right,因为
定界符的高度与
两个命令。但是,\left 不一定是实际的 'left
分隔符',也就是说,如果有某种原因,你可以使用'\left)'
去做。"""
sum(ps)
= 1 但 sum(pt)
在以下情况下远小于 1:
代码中是否有不正确的地方?谢谢!
更新:
为了使 pt 和 ps 的和都为 1,我不得不将代码更改为:
vocab = Counter(_s)+Counter(_t)
ps=[]
pt = []
for t, v in vocab.iteritems():
if t in _s:
pts = gamma * (_s[t] / ssum)
else:
pts = epsilon
if t in _t:
ptt = gamma * (_t[t] / tsum)
else:
ptt = epsilon
ps.append(pts)
pt.append(ptt)
return ps, pt
最佳答案
sum(ps) 和 sum(pt) 都是 _s 和 _t 的总概率质量在 s 的支持下(“s 的支持”我指的是出现在 _s 中的所有单词,不管 _t 中出现的单词)。这意味着
所以,我不认为代码有问题。
此外,与问题的标题相反,kldiv() 不计算对称 KL 散度,而是计算 _s 和平滑版本的 _t 之间的 KL 散度。
关于python - 计算两个文档之间的对称 Kullback-Leibler 散度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482943/
我编写了一个函数来计算从 N(mu2, sigma2) 到 N(0, 1) 的 Kullback-Leibler 散度。 mu1 f(5, 1) [1] 12.5 我确信这个结果是正确的,因为我手边
我想使用 Jensen-Shannon 散度作为直方图距离函数。我正在实现一个简单的图像相似性搜索,直方图是归一化的 RGB 颜色分布。 我对 Kullback-Leibler 散度公式(JS 的依据
我正在尝试计算字符串中字符的散度,但我真的不知道如何将 Kullback 散度算法应用于此类问题。请任何人解释我可以用来解决这样的问题的 KLD 算法。 谢谢 最佳答案 KL 散度是一种度量,它可以为
我做了一个java实现Kullback-leibler散度的方法。我使用了以 2 为基数的日志,但我不确定我是否正确使用了它,或者我应该使用以 10 为基数的日志值。我正在使用这种方法来测量两个文本单
我已经关注论文here和代码 here (它是使用对称 kld 和论文中第一个链接中提出的退避模型实现的)用于计算两个文本数据集之间的 KLD。我在最后更改了 for 循环以返回两个数据集的概率分布,
我知道 KL 不是一个指标,也不能被视为一个指标。但是,是否可以使用 KL 来衡量一幅图像与另一幅图像的差异?我试图从中得出一种直觉。提前感谢所有回复。 最佳答案 KL 测量两个概率分布之间的差异。
我正在处理属于 2 个组(A 和 B)的数据。我试图找到显示两个群体之间最大差异的变量,我认为 Kullback-Leibler 距离将是一个很好的衡量标准。这是代表我的数据的示例 df1 <- st
我在java中有这个方法来计算概率分布的KL: public static double klDivergence(double[] p1, double[] p2) { double klDi
我有以下问题:我有一个矩阵,比如 20K 离散分布(直方图),我需要计算这些对之间的 KL 散度 (KLD)。简单的方法是使用两个 for 循环并通过标准 KLD 计算计算每两个分布之间的 KLD。这
在从 mallet 中的各种文档中获得各种概率分布后,我应用以下代码来计算第一个和第二个文档之间的 KL 散度: Maths.klDivergence(double[] d1,doub
我需要最小化 KL loss在 tensorflow . 我试过这个功能 tf.contrib.distributions.kl(dist_a, dist_b, allow_nan=False, na
我有两个(不同长度的)数字列表。使用 Python,我想用 10 个 bin 来计算直方图。然后我想用标准核(均值为 0 的高斯核,sigma=1)平滑这两个直方图然后我想计算这两个平滑直方图之间的
function [ d ] = hcompare_KL( h1,h2 ) %This routine evaluates the Kullback-Leibler (KL) distance bet
我必须计算 Kullback-Leibler Divergence (KLD) 在数千个离散概率向量之间。目前我正在使用以下代码,但它对我的目的来说太慢了。我想知道是否有更快的方法来计算 KL 散度?
我有两个名为 x_t、x_k 的张量,分别具有以下形状 NxHxW 和 KxNxHxW,其中 K,是用于重建x_t的自动编码器的数量(如果您不知道这是什么,假设它们是K个不同的网络,旨在预测x_t,这
我有两个矩阵 X 和 Y(在大多数情况下它们是相似的)现在我想计算所有行之间的成对 KL 散度并将它们输出到一个矩阵中。例如: X = [[0.1, 0.9], [0.8, 0.2]] 然后该函数应采
我的目标是计算以下文本文档之间的 KL 距离: 1)The boy is having a lad relationship 2)The boy is having a boy relationshi
我是一名优秀的程序员,十分优秀!