我想以最快的方式在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
中每个可能的行对计算的函数答案 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循环解决方案。