2011-09-12 191 views
1

我想用python以儘可能最快的方式計算一個核心矩陣: 輸入是矩陣X = nsamples,nfeatues 並且輸出應該是一個對稱矩陣D = nsamples,nsapmles快速核心矩陣計算python

我現在正在使用的方法,即使基於迭代器似乎是非常緩慢做的循環...任何人都可以想到更好的東西?

感謝

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

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是

+0

也許這可能有所幫助:http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi.html – Benjamin

回答

1

您可以通過更換一半的運行時間爲每一個可能的對行的評估在X功能內環通過

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

嗨,組合(範圍(nsamples),2)已經返回一個迭代器到上三角矩陣索引,因此這兩種方法是等價的:對兩個版本進行計時,在兩個for循環版本中有一個小增益......我不知道爲什麼,但是10輪代碼的增益大約爲0.2秒在相同的矩陣(10次運行需要40.2秒)) –

+0

然後,你應該看看提高qaudraticChiDist的速度。 – rocksportrocker

0

經過一番搜索,我意識到可能最好的解決方案是在scipy中使用pdist函數。它實現了幾個距離函數,或者你可以傳遞函數來計算距離。然而,這個函數非常快(因爲它是在c中實現的)所提供的距離,但不幸的是,對於傳遞的函子並沒有太多的收穫。事實上,在後一種情況下,它基本上等同於純Python中建議的for循環解決方案。