私は推薦システムを使用していますが、scipyスパース行列のアクセス時間に苦労しています。スパース行列での効率的なアクセス
この場合、TrustSVDを実装していますので、列と行(CSR、CSC)の両方で動作する効率的な構造が必要です。私は両方の構造体、辞書を使用することについて考えてきましたが、どちらの方法でも、これは常に遅すぎる、特にnumpyの行列演算に比べて遅いです。
for u, j in zip(*ratings.nonzero()):
items_rated_by_u = ratings[u, :].nonzero()[1]
users_who_rated_j = ratings[:, j].nonzero()[0]
# More code...
エクストラ: 各ループは約0.033sを取るので、35,000評価を通じて一回反復して反復(SGD)あたり、我々は8時間の話をしている25回の反復の最低19minを待つことを意味します。さらに、ここではアクセスについて話していますが、因数分解部分を含めると約2日間かかります。
使用しているマトリックスは帯状になっていますか?もしそうなら、それを利用することは非常に役に立ちます。そうでない場合、リスト実装のリストはどうですか? m * n行列の場合、これはアクセス時間〜log(n)を持ち、かなり効率的です。 –
私はあなたが2つのバージョンのマトリックス(トランスポーズ)を必要とし、基礎となるデータ構造に直接アクセスする必要があると思われます。 – hpaulj
いいえ、行列は束縛されません。格付けはマトリックス内に均等に分散しています(実際にはいくつかの項目は他の項目よりも格付けが高い傾向がありますが、ここでは関係ありません)。もう一つは、この種のデュアルまたは事前計算された構造メモリを使用して速度を上げることです。しかし、私は、まばらな行列もかなり遅いので、配列の2つの辞書(軸ごとに1つ)を使用すると考えていることに気付きました。あなたはより速い解決策を思いついていますか? –