def kldiv(x, xp, k=3, base=2):
"""KL Divergence between p and q for x~p(x),xp~q(x).
x, xp should be a list of vectors, e.g. x = [[1.3],[3.7],[5.1],[2.4]]
if x is a one-dimensional scalar and we have four samples
"""
assert k <= len(x) - 1, 'Set k smaller than num samples - 1.'
assert k <= len(xp) - 1, 'Set k smaller than num samples - 1.'
assert len(x[0]) == len(xp[0]), 'Two distributions must have same dim.'
d = len(x[0])
n = len(x)
m = len(xp)
const = log(m) - log(n-1)
tree = ss.cKDTree(x)
treep = ss.cKDTree(xp)
nn = [tree.query(point, k+1, p=float('inf'))[0][k] for point in x]
nnp = [treep.query(point, k, p=float('inf'))[0][k-1] for point in x]
return (const + d * np.mean(map(log, nnp)) \
- d * np.mean(map(log, nn))) / log(base)
# DISCRETE ESTIMATORS
评论列表
文章目录