我怎样才能修复熵产生的 nan?
how can i fix entropy yielding nan?
我正在尝试从 np.histogram 由
产生的数组计算熵
mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -(data1*np.log(np.abs(data1))).sum()
但是,这个 ent1 会 returnnan。这里有什么问题?
问题是直方图中的概率为零,这在应用香农熵公式时没有数字意义。解决方案是忽略零概率。
mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
non_zero_data = data1[data1 != 0]
ent1 = -(non_zero_data*np.log(np.abs(non_zero_data))).sum()
要计算熵,您可以使用 scipy.special.entr
。例如,
In [147]: from scipy.special import entr
In [148]: x = np.array([3, 2, 1, 0, 0.5, 2.5, 5])
In [149]: entr(x).sum()
Out[149]: -14.673474028700136
要检查该结果,我们还可以使用 scipy.special.xlogy
:
计算熵
In [150]: from scipy.special import xlogy
In [151]: -xlogy(x, x).sum()
Out[151]: -14.673474028700136
最后,我们可以验证这是否与您期望的结果相同:
In [152]: xnz = x[x != 0]
In [153]: -(xnz*np.log(xnz)).sum()
Out[153]: -14.673474028700136
使用numpy.nansum
https://numpy.org/doc/stable/reference/generated/numpy.nansum.html
mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -np.nansum(data1*np.log(np.abs(data1)))
我正在尝试从 np.histogram 由
产生的数组计算熵mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -(data1*np.log(np.abs(data1))).sum()
但是,这个 ent1 会 returnnan。这里有什么问题?
问题是直方图中的概率为零,这在应用香农熵公式时没有数字意义。解决方案是忽略零概率。
mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
non_zero_data = data1[data1 != 0]
ent1 = -(non_zero_data*np.log(np.abs(non_zero_data))).sum()
要计算熵,您可以使用 scipy.special.entr
。例如,
In [147]: from scipy.special import entr
In [148]: x = np.array([3, 2, 1, 0, 0.5, 2.5, 5])
In [149]: entr(x).sum()
Out[149]: -14.673474028700136
要检查该结果,我们还可以使用 scipy.special.xlogy
:
In [150]: from scipy.special import xlogy
In [151]: -xlogy(x, x).sum()
Out[151]: -14.673474028700136
最后,我们可以验证这是否与您期望的结果相同:
In [152]: xnz = x[x != 0]
In [153]: -(xnz*np.log(xnz)).sum()
Out[153]: -14.673474028700136
使用numpy.nansum
https://numpy.org/doc/stable/reference/generated/numpy.nansum.html
mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -np.nansum(data1*np.log(np.abs(data1)))