Python:用于内核计算的更快的函数

Python:用于内核计算的更快的函数,python,numpy,scipy,scikit-learn,Python,Numpy,Scipy,Scikit Learn,我有一个如下的函数,用于计算实例x和y之间的内核: def my_hik(x, y): """Histogram-Intersection-Kernel """ summe = 0 for i in xrange(len(x)): summe += min(x[i],y[i]) return summe #return np.sum(np.min(np.array([[x],[y]]),0)) metrics.pairwise

我有一个如下的函数,用于计算实例x和y之间的内核:

def my_hik(x, y):
     """Histogram-Intersection-Kernel """
     summe = 0
     for i in xrange(len(x)):
         summe += min(x[i],y[i])
     return summe
     #return np.sum(np.min(np.array([[x],[y]]),0))

metrics.pairwise.pairwise_kernels(instances, metric=my_hik, n_jobs=-1)
我称之为成对核函数。但是我的数据(大约3000个实例,有100个属性)似乎太大,一个矩阵的计算需要几分钟(因为函数调用了9*10^6次)。有没有办法让函数运行得更快

def fast_hik(x, y):
    return np.minimum(x, y).sum()
时间:

>>> x = np.random.randn(100)
>>> y = np.random.randn(100)
>>> %timeit my_hik(x, y)
10000 loops, best of 3: 50.3 µs per loop
>>> %timeit fast_hik(x, y)
100000 loops, best of 3: 5.55 µs per loop
对于较长的矢量,可获得更大的加速比:

>>> x = np.random.randn(1000)
>>> y = np.random.randn(1000)
>>> %timeit my_hik(x, y)
1000 loops, best of 3: 498 µs per loop
>>> %timeit fast_hik(x, y)
100000 loops, best of 3: 7.92 µs per loop

我认为自己被彻底打败了!仅供参考,如果您曾经有过100倍的点数,请看一看:或者只使用AdditiveChi2采样器。我经常发现这比直方图交点更有效。