【问题标题】:Fast Kernel matrix computation python快速核矩阵计算python
【发布时间】:2011-11-15 13:08:01
【问题描述】:

我想以最快的方式在 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 中每对可能的行进行评估的函数

【问题讨论】:

标签: python numpy machine-learning svm


【解决方案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 的速度。

【讨论】:

  • 您好,combinations(range(nsamples),2) 已经返回了上三角矩阵索引的迭代器,因此这两种方法是等价的:对这两个版本进行计时,两者都有一个小增益for 循环版本...我不知道为什么,但在同一矩阵上的 10 轮代码的增益约为 0.2 秒(10 次运行需要 40.2 秒))
  • 那你应该看看提高qaudraticChiDist的速度。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2016-09-02
    • 2018-09-03
    • 2015-03-18
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多