2016-03-31 20 views
1

Python Numpy入れ子ループ - 高速計算方法は?以下の合計で

summing = 0 

    update = np.zeros((5172,)) 

    for index, xi in enumerate(x_v1): 
     yval = y[index] 
     kernel_sum = 0 
     for index_val, x_val in enumerate(x_v1): 
      kernel_sum += update[index_val] *(np.dot(x_val, xi.transpose()) + 1)**2 
     dot_product = kernel_sum 
     dot_product = np.clip(dot_product, -20, 20) 



     summing += yval * np.log(sigmoid(dot_product)) + (1-yval)* np.log(1-sigmoid(dot_product)) 
:非常に遅い

enter image description here

私のコード、次のと

enter image description here

私はS(内積)を交換する必要があります

これをもっと速くするにはどうすればよいですか?

+0

['numpy.einsum'](https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html)を使ってみましたか? [これはいい答えです](https://stackoverflow.com/questions/26089893/understanding-numpys-einsum)それを使用するために説明します。 – wflynny

+1

コードが機能していて、コードを改善するためのヒントが必要な場合は、そのような質問をCodeReview(http://codereview.stackexchange.com/) – Alessiox

答えて

0

forループを完全に削除する必要があります(「コードをベクトル化する」、Matlabのように)。これを行う最善の方法は、最初に方程式を行列形式で定式化し、numpyのみを使って方程式を書こうとすることです。

たとえば、次のようにのみnumpyの操作を使用して、全体の二次カーネルを計算することができます。すでに、実質的に計算時間を短縮します

K = (x_v1.dot(x_v1.T) + rho) ** 2 

を。

+0

にお送りください。あなたもこれに答えることができますか? http://stackoverflow.com/questions/36457849/building-a-decision-tree – Jobs

関連する問題