ユーザー評価データ (特に 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