2016-10-20 5 views
0

私は、100万行と100列のサイズの行列に対して次のコードを実行しました。Pythonでのループ最適化について

私は次のコードを最適化するつもりです。どんな助けでも本当に感謝しています。

def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): 

    Q = Q.T 

    for step in range(steps): 
     e = 0 
     for i in range(len(R)): 
      for j in range(len(R[i])): 
       if R[i][j] > 0: 
        temp_dot = numpy.dot(P[i,:],Q[:,j]) 
        eij = R[i][j] - temp_dot 
        e = e + eij*eij 
        for k in range(K): 
         P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) 
         Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j]) 
         e = e + (beta/2) * ((P[i][k]*P[i][k]) + (Q[k][j]*Q[k][j])) 
     if e < 0.001: 
      break 

    return P, Q.T 
+0

どのように大きなこのマシンとどのくらいの時間がかかりますされています

for k in range(K): P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j]) e = e + (beta/2) * ((P[i][k]*P[i][k]) + (Q[k][j]*Q[k][j])) 

は次のようにベクトル化することができますか? – acushner

+0

一度にすべてを実行する必要がありますか、これをチャンクするかスレッドすることはできますか?私はあなたの操作を分かりやすく分かりませんので、分割してその部分を並列に分析することはできません。 – DejaVuSansMono

+0

私は8GBのRAMとcorei5を使用しています...私は5000行と5列のサンプル行列をテストしました。それはK = 5の値で1時間近くかかりました –

答えて

3

あなたの内部ループ:

P[i,:] += alpha * np.sum(2 * eij * Q[:,j] - beta * P[i,:], axis=-1) 
Q[:,j] += alpha * np.sum(2 * eij * P[i,:] - beta * Q[:,j], axis=-1) 
e  += (beta/2) * np.sum(P[i,:]*P[i,:] + Q[:,j]*Q[:,j]) 
+0

いいね!そこに '(a + b)** 2'プロパティを使用する最後のステップでもう1つ改善があります。だから、そこに 'einsum'と' dot 'を使うことができます: 'a_b = a + b; 'a 'と' b'は 'P [i、:]'と 'Q [:、']である。 j]。それらのファンクが大好き! :) – Divakar

+0

@Divakar:直感的ではないと私には直感的だ – Eric

関連する問題