Быстрый ядро ​​для вычисления матрицы Python - PullRequest
1 голос
/ 12 сентября 2011

Я бы хотел вычислить матрицу ядра в 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 ]

1 голос
/ 12 сентября 2011

Вы можете вдвое сократить время работы, заменив внутренний цикл на

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.

0 голосов
/ 15 сентября 2011

После некоторых поисков я понял, что, вероятно, лучшее решение - использовать функцию pdist в scipy. Он реализует несколько функций расстояния или вы можете передать функтор для вычисления расстояния. Однако эта функция очень быстрая (поскольку она реализована в c) для заданных расстояний, но, к сожалению, не сильно выигрывает для переданного функтора. Действительно, в последнем случае оно в основном эквивалентно предложенному для решения цикла в чистом питоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...