協調フィルタリングでSVDを使用するにはどうすればよいですか?


30

共同フィルタリングでSVDがどのように使用されるか、少し混乱しています。ソーシャルグラフがあり、エッジから隣接行列を作成し、SVD(正則化、学習率、スパース性最適化などを忘れましょう)を使用すると、このSVDを使用して推奨事項を改善できますか?

私のソーシャルグラフがinstagramに対応しており、ソーシャルグラフのみに基づいて、サービス内のユーザーを推奨する責任が課せられたとします。最初に隣接行列を作成し、SVD取得し、最初の固有値を選択します。m × m A = U s V kA (m×m)A=UsVk

おそらく新しい行列のセットを作成します。 それでは何をしますか?

Unewm×ksnewk×kVnewk×m

私はWebを調べましたが、ほとんどのリンクはSVDの計算に焦点を当てていますが、それをどうするかについては誰も教えてくれません。だから私は何をすべきですか?


1
これはあなたの質問に答えるかもしれません:datascience.stackexchange.com/a/16523
avli

回答:


7

ただし、純粋なバニラSVDを使用すると、欠落したアイテムの値を予測することはもちろんのこと、元のマトリックスの再作成に問題が生じる可能性があります。この領域の有用な経験則は、映画ごとの平均評価を計算し、各ユーザー/映画の組み合わせについてこの平均を減算することです。つまり、各ユーザーから映画のバイアスを減算します。その後、SVDを実行することをお勧めします。もちろん、評価を再作成するため、または未知の値を予測するために、これらのバイアス値をどこかに記録する必要があります。推奨事項については、SVDに関するSimon Funkの投稿を読みました。Netflixの競争中に彼は増分SVDアプローチを考案しました。

http://sifter.org/~simon/journal/20061211.html

SVDの親類であるPCAも同様に機能するため、SVDが意味を成す前に行列Aを軽meanしていると思います。インクリメンタル計算に関して、Funkは、もしあなたが軽meanしないなら、最初の勾配方向が残りの計算を支配すると言った。基本的に物事がうまくいかないということをせずに、私はこれを直接見てきました。


24

私は反対意見を提供したいと思います:

欠損値としての欠損エッジ

協調フィルタリングの問題では、存在しない接続(ユーザーがアイテムjを評価しておらず、人xが人yを友好していない)は通常、ゼロではなく予測される欠損値として扱われます。つまり、ユーザーiがアイテムjを評価していない場合、ユーザー評価した場合に彼が何を評価するかを推測したいと思います。人がいる場合、xが friendedていないyは、我々はそれが彼がしたいということですかそう推測したくたい友人に彼を。推奨事項は、再構築された値に基づいています。ijxyijxy

ソーシャルグラフのSVDを取得する(例:を介してプラグインするsvd())と、基本的にこれらすべての欠落しているスポットにゼロを代入しています。これが問題であるということは、協調フィルタリングのユーザー項目評価の設定でより明白です。不足しているエントリを確実に入力する方法があれば、SVDを使用する必要はまったくありません。入力したエントリに基づいて推奨事項を提示するだけです。それを行う方法がない場合は、SVDを実行する前にそれらを入力しないでください。*

欠損値を持つSVD

もちろん、svd()関数は欠損値に対処する方法を知りません。それで、あなたは正確に何をすることになっていますか?さて、問題を再構成する方法があります

「元のマトリックスに最も近いランクのマトリックスを見つける」k

それが本当にあなたが解決しようとしている問題であり、あなたはsvd()それを解決するために使うつもりはありません。私のために働いた方法は(Netflix賞データで)これでした:

  • 例えば単純なモデルでエントリを合わせて試してみてくださいX I J = μ + α I + β jを。これは実際に良い仕事をします。X^i,j=μ+αi+βj

  • 各ユーザー a k -vector u iと各アイテムj a k -vector v jを割り当てます。(あなたの場合、各人は右と左のkベクトルを取得します)。最終的には、残差を内積として予測します:u i m v j mikuijkvjkuimvjm

  • アルゴリズムを使用して、元の行列までの距離を最小化するベクトルを見つけます。たとえば、このペーパーを使用します

幸運を祈ります!

*:Tenaliが推奨しているのは、基本的に最近隣です。似ているユーザーを見つけて、それについての提案をしようとします。あいにく、スパース性の問題(行列の〜99%に値が欠落している)により、コサイン距離またはジャカードの類似性などを使用し最近傍を見つけることが難しくなります。そこで、彼は、最初にユーザーをより小さな特徴空間に圧縮し、そこで比較を行うために、行列のSVD(欠損値にゼロを代入)を行うことを推奨しています。SVD-nearest-neighborsを実行することは問題ありませんが、SVDを正しい方法で実行することをお勧めします(つまり...私の方法)。無意味な価値補完を行う必要はありません!


これは実際に私が探していた応答であり、聞きたかったです:)ありがとうございます!
ヴィシャール

奇妙なことに、質問は「私はウェブを見ましたが、ほとんどのリンクはSVDの計算に焦点を当てていますが、それをどう処理するのか誰も教えてくれません。またはそのことについて、タイトルは「どうすればコラボレーションフィルタリングでSVDを使用できますか?」
テナリラマン

うん、そして私の答えは、協調フィルタリングでそれをどのように使用するかをまとめました。
スタンピージョーピート

1
+1、私が理解しているように、SVDを使用して低ランクのマトリックスを計算するのではなく、二乗誤差を最小化するための反復法ですよね?ただし、SVDを使用する場合は、マトリックス分解を行う前に、欠落しているエントリにいくつかの値を入力する必要があります。
アボカド14

1
svd()

14

SVDが何をするのかを知っているなら、それで何をするべきかが少し明白だからです:-)。

行と列は同じセットであるため、別のマトリックスAを使用してこれを説明します。マトリックスAは、行がユーザーであり、列がユーザーの好きなアイテムであるようにします。この行列は対称である必要はありませんが、あなたの場合、対称であることがわかります。SVDを考える1つの方法は次のとおりです。SVDは、ユーザーとユーザーが好むアイテムが密集した特徴ベクトルを持つ隠れた特徴空間を見つけます。

A=U×s×VUV

さて、同じ特徴空間から2つのベクトルを与え、それらが類似しているかどうかを尋ねると、それを達成するために考えられる最も簡単なことは何ですか?ドット積。

ijiUj


2つの質問:1)SVDを実行する前に、欠損値をゼロで埋めますか(アイテムiはユーザーiによってレビューされていません)?2)新しいユーザーがアイテムjを好きになる場合、どのように計算しますか?
B_Miner

1
@B_Minerこんにちは、遅れてごめんなさい。答え:1)はい、はい、通常、SVDを実行する前に欠損値をゼロで埋めます。ただし、通常はゼロ以外の評価で埋めることをお勧めします。たとえば、ユーザーがこれまでに与えた平均評価で欠損値を埋めることができます。2)SVDベースのアプローチは、既知のユーザーと既知のアイテムのみを対象としています。新しいユーザーや新しいアイテムを処理できません。そして、どうすれば新しいユーザーが来たとしても、このフレームワークで彼について予測することは何も知りません。
テナリラマン

1
@B_Miner新しいユーザー/アイテムを使用する場合は、一部のユーザー機能とアイテム機能にアクセスできると想定する必要があります。次に、PDLF(予測離散潜在因子モデル)などのより高度なモデルを使用できます。これにより、既知の機能スペースで動作するため、新しいユーザー/アイテムを処理できます。
テナリラマン

@TenaliRamanこれが表示されるかどうかわかりませんが、ここに行きます。そこで、私はトピックモデル(LDA)を使用して、読んだドキュメントに基づいてユーザー(文字どおりユーザー)の機能を構築してきました。トピックベクトルを平均して「ユーザートピックベクトル」を取得します。SVD(または、おそらくALS)でも同様のことをしたいです。既知のユーザーアイテムデータを使用してSVDを計算した後、いくつかの既知のアイテムを「訪問」する新しいユーザーがいるとします。この場合、アイテムベクトルは既知ですが、ユーザーベクトルは未知です。アイテムベクトルを使用してユーザーベクトルを計算できますか、またはすべてのデータを使用してSVDを再度計算する必要がありますか?
thecity2

偉大な答えテナリ。コンセプトを理解するのに非常に役立ちます
ニハル

3

これは、スパースSVDの推奨事項を実際に実装したり、ソースコードを調べて詳細を調べたい人のために、質問の「方法」の部分を試して回答することです。市販のFOSSソフトウェアを使用して、スパースSVDをモデル化できます。たとえば、vowpal wabbitlibFM、またはredsvd

vowpal wabbit「SVDライク」アルゴリズムの3つの実装があります(それぞれ3つのコマンドラインオプションのいずれかで選択可能)。厳密に言えば、これらは純粋な「古典的な「SVD」ではなく、「近似、反復、行列因子分解」と呼ばれるべきですが、SVDと密接に関連しています。ゼロ)行列。

Netflixスタイルの映画の推奨を行うための完全で実用的なレシピvowpal wabbitと、--lrq私にとって最適な「低ランクの2次」()オプションを以下に示します。

データセット形式ファイルratings.vw(各評価はユーザーと映画ごとに1行で):

5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...

ここで、最初の数字は評価(1〜5つ星)の後に、評価したユーザーのIDと評価された映画IDが続きます。

テストデータは同じ形式ですが、(オプションで)評価列を省略できます。

 |user 1 |movie 234
 |user 12 |movie 1019
...

オプションで、予測を評価/テストするには、予測を比較するための評価が必要です。評価を省略すると、評価vowpal wabbitは予測されますが、予測エラー(予測値とデータの実際の値)を推定することはできません。

トレーニングvowpal wabbitするために、Nユーザーとユーザーが好きな(または嫌いな)映画の間の潜在的な相互作用要因のセットを見つけるように依頼します。これは、同様のユーザーが映画のサブセットを同様に評価する一般的なテーマを見つけ、これらの一般的なテーマを使用して、ユーザーがまだ評価していない映画を評価する方法を予測することと考えることができます。

vw 使用する必要があるオプションと引数:

  • --lrq <x><y><N> 「低ランクの2次」潜在因子を見つけます。
  • <x><y>:「um」は、データセット内のu [sers]およびm [ovie]名前空間を横断することを意味します。--lrqオプションでは、各ネームスペースの最初の文字のみが使用されることに注意してください。
  • <N>N=14以下は、見つけたい潜在的要因の数です
  • -f model_filename:最終モデルを書き込みます model_filename

したがって、単純な完全なトレーニングコマンドは次のようになります。

    vw --lrq um14 -d ratings.vw -f ratings.model

ratings.modelモデルファイルを取得したら、それを使用して新しいデータセットの追加の評価を予測できますmore_ratings.vw

    vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted

予測はファイルに書き込まれますmore_ratings.predicted

ソースツリーで使用demo/movielensすると、14個の潜在因子(SVD中間マトリックスが14x14行x列マトリックスであることを意味しvowpalwabbitます)で100万人のユーザー/映画の評価ml-1m.ratings.train.vwをトレーニングし、独立したテストセットml-1m.ratings.test.vw。0.69 MAEはどれくらい良いですか?未評価(0)の場合[0〜5]を含む可能な予測の全範囲では、0.69エラーは全範囲の約13.8%(0.69 / 5.0)、つまり約86.2%の精度(1-0.138)です。

vowpal wabbitgithubのソースツリーに、ドキュメントと同様のデータセット(movielens)の例と完全なデモがあります。

ノート:

  • movielensデモは、私は私の例から(簡略化のため)、省略いくつかのオプションを使用しています。特に--loss_function quantile--adaptive、および--invariant
  • --lrq実装は、特にモデルを保存およびロードするときに、vwよりもはるかに高速です--rank

クレジット:

  • --rank vwオプションはJake Hofmanによって実装されました
  • --lrq vwオプション(オプションのドロップアウト付き)はPaul Mineroによって実装されました
  • vowpal wabbit(別名vw)はジョンラングフォードの頭脳

1

名前SVDは誤解を招くものだと思います。実際、SVD推奨システムのメソッドはSVD分解を直接使用しません。代わりに、確率的勾配降下法を使用してバイアスと因子ベクトルを訓練します。

セクションと本の推薦システムのための詳細SVDSVD++アルゴリズムを見つけることができます。5.3.15.3.2Francesco Ricci, Lior Rokach, Bracha Shapira, and Paul B. Kantor. Recommender Systems Handbook. 1st edition, 2010

Pythonには、これらのアルゴリズムを実装した定評のあるパッケージがありますsurprise。そのではドキュメント、彼らはまた、これらのアルゴリズムの詳細に言及します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.