[Frontmatter](如果你只想要问题,请跳过这个):
我目前正在使用Shannon-Weaver Mutual Information和normalized redundancy来测量由功能组织的离散和连续特征值袋之间的信息屏蔽程度。使用这种方法,我的目标是构造一个看起来非常类似于ID3的算法,而不是使用Shannon entropy,该算法将寻求(作为循环约束)来最大化或最小化单个特征和特征集合之间的共享信息基于完整的输入特征空间,如果(并且只有)它们分别增加或减少相互信息,则将新特征添加到后一集合。这实际上将ID3的决策算法移动到成对空间中,与两种方法的所有预期时间和空间复杂性吻合在一起。
[/ Frontmatter]
关于这个问题:我正在尝试使用SciPy在Python中连续使用integrator。因为我正在处理离散和连续变量的比较,所以我的功能特征对每个比较的当前策略如下:
>离散特征与离散特征:使用离散形式的互信息。这导致概率的双重求和,我的代码处理没有问题。
>所有其他情况(离散与连续,反向和连续与连续):使用连续的形式,使用Gaussian estimator平滑probability density functions。
对于后一种情况,我可能对某种离散化进行某种离散化,但是由于我的输入数据集本身并不是线性的,所以这是非常复杂的。
这里是显着的代码:
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的大小相互接近无穷大,这个效果可以忽略不计。
我目前的困扰是试图让multiple integration在SciPy上打Gaussian kernel density estimate。我一直在试图使用SciPy的dblquad进行集成,但是在后一种情况下,我会收到以下消息的惊喜。
Warning: The ocurrence of roundoff error is detected, which prevents
the requested tolerance from being achieved. The error may be
underestimated.
当我将它设置为使用错误处理程序“调用”时:
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)
然而,舍入纠正的问题仍然存在,对于更强大的实现的请求也是如此。任何领域的任何帮助将不胜感激。