7

ユーザー評価データ (特に MovieLens100K データ) からユーザー間類似性マトリックスを生成しています。相関を計算すると、いくつかの NaN 値が得られます。より小さなデータセットでテストしました:

ユーザーとアイテムの評価マトリックス

   I1 I2 I3 I4
U1 4  0  5  5  
U2 4  2  1  0  
U3 3  0  2  4  
U4 4  4  0  0  

ユーザー間ピアソン相関類似性マトリックス

              U1        U2        U3       U4      U5
U1             1        -1         0      -nan  0.755929
U2            -1         1         1      -nan -0.327327
U3             0         1         1      -nan  0.654654
U4          -nan      -nan      -nan      -nan      -nan
U5      0.755929 -0.327327  0.654654      -nan         1

ピアソン相関の計算では、2 人のユーザー間で相関されたアイテムのみが考慮されます。(「レコメンダ システムの次世代に向けて: 最先端技術と可能な拡張機能の調査」、Gediminas Adomavicius、Alexander Tuzhilin を参照してください。

NaN 値を処理するにはどうすればよいですか?

編集 これは、Rでピアソン相関を見つけるコードです。Rマトリックスは、ユーザーアイテム評価マトリックスです。1 ~ 5 のスケール評価が含まれます。0 は評価されていないことを意味します。Sはユーザー間相関行列です。

  for (i in 1:nrow (R))
  {
    cat ("user: ", i, "\n");
    for (k in 1:nrow (R))
    {
      if (i != k)
      {
        corated_list <- which (((R[i,] != 0) & (R[k,] != 0)) == TRUE);
        ui <- (R[i,corated_list] - mean (R[i,corated_list]));
        uk <- (R[k,corated_list] - mean (R[k,corated_list]));
        temp <- sum (ui * uk) / sqrt (sum (ui^2) * sum (uk^2));
        S[i,k] <- ifelse (is.nan (temp), 0, temp)
      }
      else
      {
        S[i,k] <- 0;
      }
    }
  }

行でs を 0S[i,k] <- ifelse (is.nan (temp), 0, temp)に置き換えていることに注意してください。NaN

4

1 に答える 1

3

私は最近、Java でユーザー - ユーザー & ユーザー - アイテム マトリックス用のレコメンダー システムを開発しました。まず、おそらくすでに見つけているように。RSは難しい。私の実装では、素晴らしい Apache Common Math Library を利用しました。R を使用していますが、おそらくピアソンの計算方法が比較的似ています。

あなたの質問は次のとおりでした: NaN 値を処理するにはどうすればよいですか? NaN is = 0 と言っているという編集が続きます。

私の答えはこれです:

NaN 値を 0 として扱うべきではありません。これは、ユーザーまたはユーザー/アイテム間に相関関係がまったくないということです。これは事実かもしれませんが、常にそうであるとは限りません。これを無視すると、推奨事項歪められます。

まず、「なぜ NaN 値を取得しているのか」と自問する必要があります。NaN 値を取得する理由を詳しく説明している NaN の Wiki ページからのいくつかの理由を次に示します。

NaN を返す操作には、次の 3 種類があります。

  1. 少なくとも 1 つのオペランドとして NaN を使用する演算。

  2. 不定形 除算 0/0 および ±∞/±∞ 乗算 0×±∞ および ±∞×0 足し算 ∞ + (−∞)、(−∞) + ∞ および同等の引き算 標準にはべき乗の代替関数があります。標準の pow 関数と整数指数 pown 関数は、00、1∞、および ∞0 を 1 として定義します。powr 関数は、3 つの不定形をすべて無効な演算として定義するため、NaN を返します。

  3. 複雑な結果を伴う実際の演算。例: 負の数の平方根。負の数値の対数 -1 より小さい数値または +1 より大きい数値の逆正弦または逆余弦。

アプリケーションをデバッグし、各ステップを実行して、上記の理由のどれが問題の原因であるかを確認する必要があります。

第二に、ピアソンズ相関はさまざまな方法で表すことができることを理解する必要があります。サンプル全体または母集団全体で計算するかどうかを検討し、適切な計算方法を見つける必要があります。つまり、母集団に対してです。

cor(X, Y) = Σ[(xi - E(X))(yi - E(Y))] / [(n - 1)s(X)s(Y)]

ここで、E(X) は X の平均、E(Y) は Y 値の平均、s(X)、s(Y) は標準偏差であり、標準偏差は通常、分散の正の平方根であり、分散 = sum((x_i - 平均)^2) / (n - 1)

ここで、mean は Mean で、n は標本観測の数です。

これはおそらく NaN が表示される場所です。つまり、評価されていない場合は 0 で除算します。可能であれば、評価されていないことを意味する 0 の値を使用しないことをお勧めします。代わりに null を使用してください。私がこれを行う理由は 2 つあります。1. 0 はおそらく NaN を使用して結果を作成しているものであり、2. 読みやすさ/理解のしやすさです。あなたのスケールは 1 ~ 5 です。0 は機能すべきではなく、混乱を招きます。そのため、可能であれば避けてください。

第三に、レコメンダーの立場から、レコメンドの観点から物事を考えます。2 人のユーザーがいて、共通の評価が 1 つしかない場合、小さなデータセットの I1 に対して U1 と U4 とします。その共通の 1 つのアイテムは、推奨事項を提供するのに本当に十分ですか? 答えは - もちろん違います。したがって、レコメンデーションの品質が向上するように、ratingInCommon の最小しきい値を設定することもお勧めします。このしきい値に設定できる最小値は 2 ですが、もう少し高く設定することを検討してください。MovieLens の調査を読むと、5 ~ 10 に設定されています (頭の中で思い出せません)。これを高く設定すると、得られるカバレッジは少なくなりますが、「より良い」(より低いエラー スコア) 推奨事項を達成できます。君は'

以上の点について。U4 を見て、他のすべてのユーザーと比較してください。U4 にはどのユーザーとも共通する項目が 1 つしかないことに注目してください。ここで、NaN が U4 でのみ表示されることに気付くと思います。この回答に従っている場合は、NaN を取得している理由が、実際には 1 つの項目だけでピアソンを計算できるためであることがわかります:)。

最後に、上記のサンプル データセットで少し気になる点は、1 と -1 の相関の数です。これらのユーザーの好みについて実際に何を言っているのかを考えてから、実際の評価と照らし合わせて確認してください。たとえば、U1 と U2 の評価を見てください。項目 1 では、1 という強い正の相関 (両方とも 4 と評価) があり、項目 3 では強い負の相関 (U1 は 5 と評価、U3 は 1 と評価) があり、これら 2 人のユーザー間のピアソン相関が - 1 (つまり、彼らの好みは完全に反対です)。これは明らかに当てはまらず、実際にはピアソン スコアは 0 より少し上か少し下にあるはずです。

現在、ユーザーが評価していないアイテムを「記入」するための戦略が用意されています。読む必要があるものについては詳しく説明しませんが、基本的には、そのアイテムの平均スコアまたはそのユーザーの平均評価を使用するようなものです. どちらの方法にも欠点があり、個人的にはどちらもあまり好きではありません。私のアドバイスは、ユーザーが 5 つ以上のアイテムを共有している場合にのみ、ユーザー間のピアソン相関を計算し、評価が 0 (またはそれ以上 - ゼロ) のアイテムを無視することです。

結論として。

  1. NaN は 0 ではないため、0 に設定しないでください。
  2. スケール内の 0 は null としてより適切に表現されます
  3. 2 人のユーザー間で共通する項目の数が 1 を超え、できれば 5/10 を超える場合にのみ、Pearson Correlations を計算する必要があります。
  4. 2 人のユーザーが共通してアイテムを評価した場合にのみピアソン相関を計算し、他のユーザーによって評価されていないアイテムをスコアに含めないでください。

お役に立てば幸いです。

于 2014-12-03T17:37:07.687 に答える