Python:更快的核评估函数

2 投票
1 回答
1064 浏览
提问于 2025-04-18 14:25

我有一个函数,下面这个函数用来计算两个实例 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)

我用 sklearn 的 pairwise_kernels 函数来调用它。但是我的数据量比较大,有大约 3000 个实例,每个实例有一百个属性。这样一来,计算一个矩阵就要花好几分钟(因为这个函数被调用了 9*10^6 次)。有没有什么办法可以让这个函数运行得更快呢?

1 个回答

5
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

时间:

对于更长的向量,可以获得更大的加速效果:

撰写回答