Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 香农的导数是什么;熵?_Python_Numpy_Data Science_Derivative_Entropy - Fatal编程技术网

Python 香农的导数是什么;熵?

Python 香农的导数是什么;熵?,python,numpy,data-science,derivative,entropy,Python,Numpy,Data Science,Derivative,Entropy,我有以下简单的python函数,根据Shannon的信息理论计算单个输入X的熵: import numpy as np def entropy(X:'numpy array'): _, frequencies = np.unique(X, return_counts=True) probabilities = frequencies/X.shape[0] return -np.sum(probabilities*np.log2(probabilities)) a = np.ar

我有以下简单的python函数,根据Shannon的信息理论计算单个输入X的熵:

import numpy as np

def entropy(X:'numpy array'):
  _, frequencies = np.unique(X, return_counts=True)
  probabilities  = frequencies/X.shape[0]
  return -np.sum(probabilities*np.log2(probabilities))

a = np.array([1., 1., 1., 3., 3., 2.])
b = np.array([1., 1., 1., 3., 3., 3.])
c = np.array([1., 1., 1., 1., 1., 1.])

print(f"entropy(a): {entropy(a)}")
print(f"entropy(b): {entropy(b)}")
print(f"entropy(c): {entropy(c)}")
输出如下:

entropy(a): 1.4591479170272446
entropy(b): 1.0
entropy(c): -0.0
但是,我还需要计算
dx
上的导数:

d熵/dx

这不是一项容易的任务,因为主要公式

-np.sum(概率*np.log2(概率))

采用
概率
,而不是
x
值,因此不清楚如何区分
dx


有人知道怎么做吗?

解决这个问题的一种方法是用数值计算导数

在这种情况下,我们可以定义一个小常数来帮助我们计算数值导数。此函数接受一个单参数函数,并计算其对输入
x
的导数:

ε = 1e-12
def derivative(f, x):
    return (f(x + ε) - f(x)) / ε
为了使我们的工作更容易,让我们定义一个计算熵最内部运算的函数:

def inner(x):
    return x * np.log2(x)
回想一下,总和的导数就是导数之和。因此,实导数计算发生在我们刚刚定义的
内部
函数中

熵的数值导数是:

def numerical_dentropy(X):
    _, frequencies = np.unique(X, return_counts=True)
    probabilities = frequencies / X.shape[0]
    return -np.sum([derivative(inner, p) for p in probabilities])
我们能做得更好吗?我们当然可以!这里的关键观点是产品规则:
(fg)'=fg'+gf'
,其中
f=x
g=np.log2(x)
。(还要注意
d[log_a(x)]/dx=1/(x ln(a))

因此,分析熵可以计算为:

import math
def dentropy(X):
    _, frequencies = np.unique(X, return_counts=True)
    probabilities = frequencies / X.shape[0]
    return -np.sum([(1/math.log(2, math.e) + np.log2(p)) for p in probabilities])
使用样本向量进行测试,我们有:

a = np.array([1., 1., 1., 3., 3., 2.])
b = np.array([1., 1., 1., 3., 3., 3.])
c = np.array([1., 1., 1., 1., 1., 1.])

print(f"numerical d[entropy(a)]: {numerical_dentropy(a)}")
print(f"numerical d[entropy(b)]: {numerical_dentropy(b)}")
print(f"numerical d[entropy(c)]: {numerical_dentropy(c)}")

print(f"analytical d[entropy(a)]: {dentropy(a)}")
print(f"analytical d[entropy(b)]: {dentropy(b)}")
print(f"analytical d[entropy(c)]: {dentropy(c)}")
在执行时,我们可以:

numerical d[entropy(a)]: 0.8417710972707937
numerical d[entropy(b)]: -0.8854028621385623
numerical d[entropy(c)]: -1.4428232973189605
analytical d[entropy(a)]: 0.8418398787754222
analytical d[entropy(b)]: -0.8853900817779268
analytical d[entropy(c)]: -1.4426950408889634
torch entropy: 1.4591479301452637
torch derivative: 0.8418397903442383
torch entropy: 1.0
torch derivative: -0.885390043258667
torch entropy: -0.0
torch derivative: -1.4426950216293335
作为奖励,我们可以使用库测试这是否正确:

这给了我们:

numerical d[entropy(a)]: 0.8417710972707937
numerical d[entropy(b)]: -0.8854028621385623
numerical d[entropy(c)]: -1.4428232973189605
analytical d[entropy(a)]: 0.8418398787754222
analytical d[entropy(b)]: -0.8853900817779268
analytical d[entropy(c)]: -1.4426950408889634
torch entropy: 1.4591479301452637
torch derivative: 0.8418397903442383
torch entropy: 1.0
torch derivative: -0.885390043258667
torch entropy: -0.0
torch derivative: -1.4426950216293335

你可能会找到你的答案,或者(这是互联网搜索的结果;我不是这方面的专家)。@anatolyg感谢你的回答,遗憾的是,没有一个链接提供答案,第一个讨论如何找到最大熵,第二个是相对于
p
(超过
d概率
)。