[Frontmatter] (如果您只想要问题,可以跳过这部分):
我目前正在研究使用Shannon-Weaver Mutual Information和normalized redundancy来衡量离散和连续特征值之间的信息屏蔽程度,这些特征值按特征组织。使用这种方法,我的目标是构建一个非常类似于ID3的算法,但该算法不会使用Shannon entropy,而是寻求(作为循环约束条件)最大化或最小化单个特征和基于完整输入特征空间的特征集合之间的共享信息,仅在它们相应地增加或减少互信息的情况下,将新特征添加到后者集合中。实际上,这将ID3的决策算法移动到对偶空间,并用预期的时间和空间复杂性将集成方法与其固定在一起。
[/Frontmatter]
问题是:我正在尝试使用SciPy在Python中实现一个连续的积分器。由于我正在比较离散和连续变量,因此我的当前策略是针对每个特征-特征对进行以下操作:
我可以对后一种情况进行某种形式的离散化,但由于我的输入数据集本质上不是线性的,这可能会使问题过于复杂。
这是关键代码:
import math
import numpy
import scipy
from scipy.stats import gaussian_kde
from scipy.integrate import dblquad
# Constants
MIN_DOUBLE = 4.9406564584124654e-324
# The minimum size of a Float64; used here to prevent the
# logarithmic function from hitting its undefined region
# at its asymptote of 0.
INF = float('inf') # The floating-point representation for "infinity"
# x and y are previously defined as collections of
# floating point values with the same length
# Kernel estimation
gkde_x = gaussian_kde(x)
gkde_y = gaussian_kde(y)
if len(binned_x) != len(binned_y) and len(binned_x) != len(x):
x.append(x[0])
y.append(y[0])
gkde_xy = gaussian_kde([x,y])
mutual_info = lambda a,b: gkde_xy([a,b]) * \
math.log((gkde_xy([a,b]) / (gkde_x(a) * gkde_y(b))) + MIN_DOUBLE)
# Compute MI(X,Y)
(minfo_xy, err_xy) = \
dblquad(mutual_info, -INF, INF, lambda a: 0, lambda a: INF)
print 'minfo_xy = ', minfo_xy
请注意,故意多计算一个点是为了防止 SciPy 的 gaussian_kde 类出现奇异性。随着 x 和 y 的大小相互趋近于无穷大,这种影响变得可以忽略不计。
当我设置
numpy.seterr(all='ignore')
时:警告:检测到舍入误差的发生,这会阻止实现所请求的容限。错误可能被低估。
而当我使用错误处理程序将其设置为
'call'
时:
Floating point error (underflow), with flag 4
Floating point error (invalid value), with flag 8
很容易想象出正在发生什么,对吧?嗯,几乎是的:IEEE 754-2008和SciPy只告诉我这里正在发生什么,而不是为什么或如何解决它。minfo_xy
会解析为nan
;在执行Float64数学运算时,采样不足以防止信息丢失或无效。使用SciPy时,是否有一般性的解决方法?
更好的是:如果Python中有一个稳健的、罐装的连续互信息实现,它具有一个接口,可以接受两个浮点值集合或一组合并的对,请提供链接,如果您知道存在这样的实现,它将解决这个完整的问题。
提前致谢。
编辑:这解决了上面例子中的nan
传播问题:
mutual_info = lambda a,b: gkde_xy([a,b]) * \
math.log((gkde_xy([a,b]) / ((gkde_x(a) * gkde_y(b)) + MIN_DOUBLE)) \
+ MIN_DOUBLE)
然而,舍入校正的问题仍然存在,对于更强大的实现也有要求。在这两个方面提供任何帮助将不胜感激。