Python:更快的核评估函数
我有一个函数,下面这个函数用来计算两个实例 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
时间:
对于更长的向量,可以获得更大的加速效果: