Не в состоянии понять функцию Python косинуса подобия

Я работаю с примером в блоге чтобы понять метод совместного фильтра, используемый в системе рекомендаций. Я столкнулся с косинусным сходством, выраженным как

 введите описание изображения здесь

В python, используя numpy, его записывают как

def similarity(ratings, kind='user', epslion=1e-9):
      if kind == 'user' :
         sim = ratings.dot(ratings.T)
      elif (kind=='item'):
          sim = ratings.T.dot(ratings) + epslion
      norms = np.array([np.sqrt(np.diagonal(sim))])

      return  (sim / norms / norms.T )
  

Вопросы

  1. что за математика стоит за вычислением нормы в коде
  2. как (sim / norms / norms.T ) равно sim(u,u`) в уравнении

Заранее спасибо за ваше время - если я что-то пропустил, переоценил или недооценил конкретный момент, дайте мне знать в комментариях.

4 голоса | спросил Nithin Varghese 26 AMpThu, 26 Apr 2018 11:27:35 +030027Thursday 2018, 11:27:35

1 ответ


0
Рейтинги хранятся в единой матрице ---- +: = 0 =: + ---- , где строки соответствуют пользователям (индекс ---- +: = 1 =: + ---- ), а столбцысоответствуют элементам (индекс ---- +: = 2 =: + ---- ).Поскольку вы хотите рассчитать ---- +: = 3 =: + ---- , то есть сходство между пользователями, давайте предположим, что ниже ---- +: = 4 =: + ---- .Теперь давайте сначала посмотрим на ---- +: = 5 =: + ---- без масштабных коэффициентов.Это выражение суммируется по ---- +: = 6 =: + ----, что можно интерпретировать как матричное умножение ---- +: = 7 =: + ---- с транспонированием ---- +: = 8 =: + ---- , то есть:Как уже было сделано выше, давайте обозначим полученную матрицу как ---- +: = 10 =: + ---- (переменная ---- +: = 11 =: + ---- в коде).Эта матрица по определению является симметричной, а ее строки /столбцы помечены индексами «пользователя» ---- +: = 12 =: + ---- .Теперь масштабный «фактор» ---- +: = 13 =: + ---- фактически является вектором, индексированным с помощью ---- +: = 14 =: + ---- (каждый элемент которогоевклидова норма соответствующей строки матрицы ---- +: = 15 =: + ---- ).Однако, построив ---- +: = 16 =: + ---- , мы можем видеть, что ---- +: = 17 =: + ---- не что иное, как ---- +: =18 =: + ---- .Наконец, интересующий фактор сходства ---- +: = 19 =: + ---- .Размещенный код вычисляет это для всех индексов ---- +: = 20 =: + ---- и возвращает результат в виде матрицы.Для этого это:вычисляет ---- +: = 21 =: + ---- (матрица ---- +: = 22 =: + ---- выше) как ---- +: = 23 =: + --получает квадратный корень из его диагонали (вектор ---- +: = 24 =: + ---- выше) как ---- +: = 25 =: + ----для эффективного масштабирования строки /столбца ---- +: = 26 =: + ---- это затем выражается в виде двумерного массива ---- +: = 27 =: + ---- (обратите внимание на недостающее ---- +: = 28 =: + ---- в вашем сообщении)наконец, матрица ---- +: = 29 =: + ---- рассчитывается как ---- +: = 30 =: + ---- .Здесь, поскольку ---- +: = 31 =: + ---- имеет форму ---- +: = 32 =: + ---- , первое деление выполняет масштабирование столбца, а деление с -- +: = 33 =: + ---- масштабирует строки.
ответил ewcz 26 PMpThu, 26 Apr 2018 14:30:38 +030030Thursday 2018, 14:30:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132