Я генерирую пользовательскую -матрицу подобия пользователей из данных пользовательского -рейтинга (, в частности данных 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
Для вычисления корреляции Пирсона между двумя пользователями рассматриваются только коррелированные элементы. (См. К следующему поколению рекомендательных систем :Обзор состояния --искусства и -возможных расширений, Гедиминаса Адомавичуса, Александра Тужилина
Как я могу обрабатывать значения 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[i,k] <- ifelse (is.nan (temp), 0, temp)
я заменяю NaN
на 0.