快速内核矩阵计算python

时间:2011-09-12 17:43:57

标签: python numpy machine-learning svm

我想以最快的方式在python中计算内核矩阵: 输入是矩阵X = nsamples,nfeatues 输出应该是对称矩阵D = nsamples,nsapmles

我现在正在使用的方法,即使基于迭代器似乎对for循环来说真的很慢......有人能想到更好的东西吗?

由于

到目前为止,我的方法是:

from itertools import combinations
def computeKernel(X,dlambda):
    nsamples=X.shape[0]
    D=numpy.zeros((nsamples,nsamples))
    for el in combinations(range(nsamples),2):
        i,j=el
        D[el]=quadraticChiDist(X[i,:],X[j,:])


    D=D+D.T
    D=numpy.exp(-dlambda*D/255)
    D=numpy.eye(D)+D    
    return D

其中quadraticChiDist是为X

中每个可能的行对计算的函数

2 个答案:

答案 0 :(得分:1)

您可以通过

替换内循环来缩短一半的运行时间
for i in range(nsamples):
    for j in range(i):
        D[i,j]=quadraticChiDist(X[i,:],X[j,:])
        D[j,i]=D[i,j]

即使quadraticChiDist不对称,也无关紧要,因为你将矩阵对称化了(你忘了除以2吗?)::

D = D + D.T

为了进一步加速,我建议优化quadraticChiDist的速度。

此外,我建议http://cython.org/,尤其是http://docs.cython.org/src/tutorial/numpy.html。在很多情况下,这可以提供C的速度。

答案 1 :(得分:0)

经过一番搜索,我意识到可能最好的解决方案是在scipy中使用pdist函数。它实现了几个距离函数,或者您可以通过仿函数来计算距离。但是,这个函数非常快(因为它在c中实现)提供的距离,但遗憾的是,对于传递的仿函数来说,它并没有获得太多。实际上,在后一种情况下,它基本上等同于纯python中建议的for循环解决方案。