2016-11-03 13 views
11

私は、C#6.0のアイテムベースの協調フィルタを使用してレストラン向けの推薦システムを開発中です。私はアルゴリズムを可能な限り実行するように設定したいので、ユーザーがまだレビューしていないレストランの評価を予測するさまざまな方法についていくつかの調査を行った。推薦システムの行列分解を使用する

私は、ユーザーが一緒にうまく適合かを確認できるようにするには、ユーザ間のピアソン相関を使用して、ユーザーベースの協調フィルタを設定したい

ファーストを行っている研究から始めましょう。
この主な問題は、この相関を計算するために必要なデータ量でした。まず、同じレストランで2人のユーザーにつき4件のレビューが必要でした。しかし、私のデータは非常に疎そうです。 2人のユーザーがまったく同じ4つのレストランを見直した可能性は低いです。私は一致条件を拡大することでこれを解決したかった(つまり、同じレストランのユーザーと同じではなく、同じ種類のレストラン)。しかし、これは相関関係でどのレビューを使用するかを決定するのが難しい問題であったユーザーは「ファーストフード」タイプのレストランで3件のレビューを残すことができました。これらのうちどれがファーストフード店での他のユーザーのレビューに最も適しているでしょうか?

さらに調査した結果、アイテムベースのコラボレーティブフィルタがユーザーベースのコラボレーティブフィルタより優れていると結論づけました。しかし、再び、データの希薄さの問題に遭遇しました。私のテストでは、ユーザーがまだレビューしていないレストランでレーティングの予測を計算することに成功しましたが、スパースデータセットでアルゴリズムを使用した場合、結果は十分ではありませんでした。 (ほとんどの場合、同じレストランを2人のユーザーが評価していないので、2つのレストランの間では類似性は不可能でした)。
さらに多くの研究をした結果、行列分解法を使用すると、疎なデータでうまくいくことが分かりました。今

私の問題

私はすべてこの方法を使用する上でのチュートリアルのためのインターネット上で探しているが、私は推薦システム内の任意の経験を持っていないと代数の私の知識も限られています。私は方法の正しさを理解しています。あなたは、1つの側にユーザ​​ーともう1つの側にレストランがあるマトリックスがあります。各セルは、ユーザーがレストランで指定したレーティングです。
行列分解法は、ユーザーとレストランの間の重みとレストランの種類とこれらの種類の間の重みを持つ2つの行列を作成します。

私が知ることができないのは、レストランのタイプとレストラン/ユーザーの間の重みを計算する方法です(行列分解を正しく理解していれば)。私はこれらの数値を計算する何十種類もの数式を見つけましたが、それらを分解してアプリケーションに適用する方法を理解することはできません。

アプリケーションでデータがどのように表示されるかの例を示します。
この表では、U1はユーザーを表し、R1はレストランを表します。 各レストランには独自のタグ(レストランの種類)があります。私。 R1は「イタリアの」タグを持っている、R2は

| R1 | R2 | R3 | R4 | 
U1 | 3 | 1 | 2 | - | 
U2 | - | 3 | 2 | 2 | 
U3 | 5 | 4 | - | 4 | 
U4 | - | - | 5 | - | 

が正しい方向に私を指すか、私は自分のデータでこのメソッドを使用する必要がありますどのように説明することができ、誰もがありますなど、「ファーストフード」を持っていますか?どんな助けでも大歓迎です!

+0

どういうわけかのアプローチが私に... *「一致しないユーザーに不審な音同じレストランではあるが、同じ種類のレストランでは「ユーザーが好きな種類の料理を評価しているかのように聞こえる。しかし、それはおそらくそうではないでしょう。ユーザーは、レストランが予想される食べ物をどれくらいうまく運んでいるかを評価しています。*まともなバーガーレストランをMc * D *に代えれば、この代用の結果はかなりランダムです.Next 'コール(私はあなたがそれより良いことを予測したいと思う?)。 – grek40

+0

これは、アイテムベースのコラボレーティブフィルタに移動するか、または行列分解を実装する方法を見つけたときに可能性があると判断した理由です。 – RandomStranger

+1

一般的な考え方は、レストランごとに評価不足をレストランタイプごとに置き換えることです。最初のマトリックスはレストランの評価を平均し、2番目のマトリックスは同じタイプのレストラン内の違いを強調表示します。たとえば、レストランAとBがイタリア語で、既存のユーザーが1と3のレートしかない場合、最初の行列は2と2番目の0,5と1,5(ここでは、セルの乗算を使用します)を含むことができます。 2人のユーザーがいる場合、2番目の行列は何とかレストラン<->の平均値をとっているので、全体の平均値は同じになります。 –

答えて

2

マトリックス分解は、ユーザーのイタリア料理の好みやアイテム食品のイタリックさなどの「潜在的要因」がマトリックスの格付けに関係していることを前提としています。

したがって、問題の種類は、さまざまな解決策が多数存在する行列再構成問題に変換されます。単純な、おそらく遅い解は、勾配降下アルゴリズムを使用して行列を近似する(ALSおよびマトリックス再構成の他の可能性の他に)。私はこの短い記事ieee article about recommender systemsをお勧めします。

潜在因子を抽出することは別の問題です。

だから、GDMの実装は次のようになります。learnsetは、IEEEの記事のようにRatingmatrixを含む2次元配列である場合は

public void learnGDM(){ 
//traverse learnSet 
for(int repeat = 0; repeat < this.steps; repeat++){ 
    for (int i = 0; i < this.learnSet.length; i++){ 
     for (int j = 0; j < this.learnSet[0].length; j++){ 
      if(this.learnSet[i][j] > 0.0d){ 
       double Rij = this.learnSet[i][j]; 

       for(int f = 0 ; f <= latentFactors; f++){ 
        double error = Rij - dotProduct(Q.getRow(i), P.getRow(j));/*estimated_Rij;*/ 
        //ieee computer 1.pdf 
        double qif = Q.get(i, f); 
        double pif = P.get(j, f); 
        double Qvalue = qif + gradientGamma * (error * pif - gradientLambda * qif); 
        double Pvalue = pif + gradientGamma * (error * qif - gradientLambda * pif); 
        Q.set(i,f, Qvalue); 
        P.set(j, f, Pvalue); 
       } 
      } 
     } 
    } 
    //check global error 
    if(checkGlobalError() < 0.001d){ 
     System.out.println("took" + repeat + "steps"); 
     break; 
    } 
} 

。 GDMアルゴリズムは、レーティングマトリクスのレーティングに近似するようにレーティングベクトルPおよびQを反復ごとに少しずつ変更する。次に、「与えられていない」格付けは、PとQの内積によって計算することができる。与えられていない格付けについての最高の見積もりが推奨事項となる。

これは最初です。並行して実行できる多くの最適化や他のアルゴリズムやGDMの修正版があります。

いくつかの良い読み取り:

recommender systems in the Encyclopedia of Machine Learning

presentation on matrix factorization

recommender systems < ---大きなもの^^

関連する問題