Как NaN обрабатывается в матрице сходства между пользователем и пользователем корреляции Пирсона в системе рекомендаций?

Я создаю матрицу сходства между пользователем и пользователем на основе данных рейтинга пользователей (в частности, данных 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) я заменяю NaNs на 0.


person phoxis    schedule 11.07.2012    source источник
comment
Что именно вы имеете в виду под ручкой? Вы можете просто сделать их 0.   -  person Steve    schedule 13.07.2012
comment
Сейчас я обнуляю их, но зачем мне это делать?   -  person phoxis    schedule 13.07.2012
comment
Теоретически наниматель предположит, что у вас нет никаких отношений с другой точкой данных. Однако, глядя на ваши фиктивные данные, большинство NaN имеют некоторую форму отношений. Вы используете правильные типы данных? Можете ли вы опубликовать код   -  person Steve    schedule 13.07.2012
comment
Да, я разместил код. Я портирую любой код на C ++ для некоторых целей, но вот прототип R-кода.   -  person phoxis    schedule 13.07.2012
comment
Нет эксперта по R, но разве cor (u1, u2) не вернет вам груши?   -  person Steve    schedule 13.07.2012
comment
Да, он выполняет ту же работу, просто назначает NA вместо NaNs.   -  person phoxis    schedule 14.07.2012


Ответы (1)


Недавно я разработал рекомендательную систему на Java для матрицы пользователь-пользователь и пользовательский элемент. Во-первых, как вы, наверное, уже нашли. RS сложны. Для своей реализации я использовал Общую математическую библиотеку Apache, которая великолепна, вы используете R, который, вероятно, относительно похож в том, как он вычисляет Пирсона.

Ваш вопрос был: как я могу обрабатывать значения NaN, за которым следует редактирование, в котором говорится, что NaN = 0.

Мой ответ такой:

На самом деле вам не следует обрабатывать значения NaN как 0, потому что вы говорите, что нет абсолютно никакой корреляции между пользователями или пользователями / элементами. Это может иметь место, но, вероятно, не всегда. Игнорирование этого исказит ваши рекомендации.

Во-первых, вы должны спросить себя: «Почему я получаю значения NaN»? Вот несколько причин на вики-странице NaN, где подробно описано, почему вы можете получить значение NaN:

Есть три типа операций, которые могут возвращать NaN:

  1. Операции с NaN как минимум с одним операндом.

  2. Неопределенные формы Деления 0/0 и ± ∞ / ± ∞ Умножения 0 × ± ∞ и ± ∞ × 0 сложения ∞ + (−∞), (−∞) + ∞ и эквивалентные вычитания В стандарте есть альтернативные функции для степеней: Стандартная функция pow и функция pown целочисленной экспоненты определяют 00, 1∞ и ∞0 как 1. Функция powr определяет все три неопределенные формы как недопустимые операции и поэтому возвращает 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) - стандартные отклонения, а стандартные отклонения - это, как правило, положительный квадратный корень из дисперсии, а дисперсия = сумма ((x_i - среднее) ^ 2) / (n - 1)

где среднее - это среднее значение, а n - количество выборочных наблюдений.

Вероятно, здесь появляется ваше NaN, то есть деление на 0 без рейтинга. Если можете, я бы посоветовал не использовать значение 0 для обозначения отсутствия рейтинга, вместо этого используйте null. Я бы сделал это по 2 причинам: 1. Вероятно, 0 - это то, что увеличивает ваши результаты с помощью NaN, и 2. Читаемость / понятность. У вас шкала от 1 до 5, поэтому 0 не должно отображаться, это сбивает с толку. Так что избегайте этого, если возможно.

В-третьих, с точки зрения рекомендаций, думайте о вещах с точки зрения рекомендаций. Если у вас 2 пользователя и у них только 1 общий рейтинг, скажем, U1 и U4 для I1 в вашем меньшем наборе данных. Достаточно ли этого общего элемента, чтобы давать рекомендации? Ответ - конечно, нет. Так что могу я также предложить вам установить минимальный порог рейтинговInCommon, чтобы гарантировать лучшее качество рекомендаций. Минимальное значение, которое вы можете установить для этого порога, - 2, но подумайте о том, чтобы установить его немного выше. Если вы читали исследование MovieLens, то они установили его в диапазоне от 5 до 10 (не помню, что у меня в голове). Чем выше вы установите это значение, тем меньшее покрытие вы получите, но вы получите «лучшие» (более низкие баллы ошибок) рекомендации. Вы, вероятно, прочитали академическую литературу, тогда вы, вероятно, уловили этот момент, но подумал, что я все равно упомяну об этом.

По вышеуказанному пункту. Посмотрите на U4 и сравните с любым другим пользователем. Обратите внимание на то, что U4 не имеет более 1 общего с любым пользователем. Теперь, надеюсь, вы заметите, что NaN появляются исключительно в U4. Если вы следовали этому ответу, то, надеюсь, теперь вы увидите, что причина, по которой вы получаете NaN, заключается в том, что вы действительно можете вычислить Pearson с одним общим элементом :).

Наконец, одна вещь, которая немного беспокоит меня в приведенном выше примере набора данных, - это количество корреляций, которые равны 1 и -1. Подумайте, что это на самом деле говорит об этих предпочтениях пользователей, а затем сверьте их с реальными рейтингами. Например. посмотрите на рейтинги U1 и U2. для элемента 1 у них есть сильная положительная корреляция 1 (оба оценили его на 4), тогда для элемента 3 у них есть сильная отрицательная корреляция (U1 оценил его на 5, U3 оценил его на 1), кажется странным, что корреляция Пирсона между этими двумя пользователями - 1 (т.е. их предпочтения полностью противоположны). Это явно не так, на самом деле оценка Пирсона должна быть немного выше или немного ниже 0. Эта проблема связана с пунктами об использовании 0 на шкале, а также сравнением только небольшого количества элементов вместе.

Теперь существуют стратегии для «заполнения» элементов, которые не были оценены пользователями. Я не буду вдаваться в подробности, которые вам нужно прочитать, но по сути это все равно, что использовать средний балл для этого элемента или средний рейтинг для этого пользователя. У обоих методов есть свои недостатки, и лично мне они не очень нравятся. Я советую рассчитывать корреляции Пирсона между пользователями только тогда, когда у них есть 5 или более общих элементов, и игнорировать элементы, у которых оценки равны 0 (или лучше - нулю).

Итак, в заключение.

  1. NaN не равно 0, поэтому не устанавливайте его в 0.
  2. 0 в вашей шкале лучше представить как ноль
  3. Вы должны рассчитывать корреляции Пирсона только тогда, когда количество общих элементов между двумя пользователями> 1, предпочтительно больше 5/10.
  4. Рассчитывайте корреляцию Пирсона только для двух пользователей, у которых они обычно оценивали элементы, не включайте в оценку элементы, которые не были оценены другим пользователем.

Надеюсь, что это поможет, и удачи.

person ngfgrant    schedule 03.12.2014