def entropy(x, k=3, base=2):
"""The classic K-L k-nearest neighbor continuous entropy estimator.
x 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.'
d = len(x[0])
N = len(x)
intens = 1e-10 # Small noise to break degeneracy, see doc.
x = [list(p + intens*nr.rand(len(x[0]))) for p in x]
tree = ss.cKDTree(x)
nn = [tree.query(point, k+1, p=float('inf'))[0][k] for point in x]
const = digamma(N) - digamma(k) + d*log(2)
return (const + d*np.mean(map(log, nn))) / log(base)
评论列表
文章目录