快速核矩阵计算python

2024-10-01 15:32:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python最快的方式计算内核矩阵: 输入是一个矩阵X=n样本,n特征 输出应该是对称矩阵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

其中quadradicchidist是对X中每个可能的行对求值的函数


Tags: 方法fromnumpyfor方式矩阵特征内核
2条回答

通过将内部循环替换为

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吗?)::

^{pr2}$

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

此外,我推荐http://cython.org/,尤其是{a2}。这在很多情况下都是C的速度。在

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

相关问题 更多 >

    热门问题