Рекомендательные алгоритмы на примере диалогов с Винни-Пухом

Рекомендательные системы, нейросети, машинленинг, искусственный интеллект - хрень окутанная туманом терминов, которая воспринимаются как нечто сложное. Когда датасайнтист описывает их - это напоминает хреновый почерк врача - нихрена непонятно, то ли цианид принять то ли аспирин. На самом деле это всратая арифметика. Пойдем от простого к сложному.

Поиск похожих штук

Возьмем ребенка. Дадим ему кубик-рубика, бильярдный шар и яблоко. И скажем - найди на чё похоже яблоко. Если он вам бильярдный шар - поздравляем, у вас растет датасайнтист! Разложим на множитили эту задачу, чтоб повторить его успех. У каждой штуки - есть характеристика. Я говорю штука, но имею ввиду любую хрень. Например человек - это тоже штука с характеристиками. И у каждой характеристики есть чиселка. Вернемся к яблокам. Яблока - твердое, яблоко - круглое. Шар твердый и круглый, а квадрат - квадратный, ну вы понели. Читобе понять что на что похоже - надо описать это что то набором характеристик и сравнить.

Продолжаем повышать планку

Такс, теперь найдем какой фильм вам понравится. Вы юзер1 - вам нравится хоббит туда обратно и гарри потер, например. Всем нравится гарри потер, но мы вернемся к этой проблеме позже. Читобе понять какой фильм тебе, юзер1 - понравится - надо найти похожих на тебя юзеров. Ну те юзер это штука из примера выше, а что ему нравится (какие фильмы) - это характеристики штуки из примера выше. Эта хрень в целом - называется датасет) Запишем его в удобном для лупоглазанья виде (csv):
_        Гарри_Поттер      ХоббитНжд                ХоббитПуст.      ХроникиНарн.      Сердце_дракона
a, 1, 1, 1, 0, 0
b, 1, 1, 1, 0, 0
c, 1, 0, 0, 1, 0
d, 1, 0, 1, 0, 0
e, 1, 1, 0, 0, 1

a, b, c - это юзеры. Теперь - вы тот ребенок. Я говорю - найди юзера похожего на «a». Внимательно смотрим на строчечки - и ищем похожие.

a и b - адинаковы - бинго, но это не даст нам рекомендаций. d - похож на a но там дырка в хоббите нежданное путешествие. Остается e. Помимо гарри потера и хоббита e нравится Сердце дракона. Юзеру а стоит посмотреть сердце дракона. Поздравлямба - мы узнали алгоримт «лупоглазим глазками». В датасаенс он называется User-Based Collaborative Filtering (UB-CF), ищем похожего юзера. Теперь смотрите по вертикали, на столбики. Видите что столбик Хоббит нежданное путешествие похож Хоббит пустошь смауга, визуально? Это называется Item-Based Collaborative Filtering (IB-CF), похожие итемы. Но на самом деле всё сводится к поиску похожих штук. То столбиков, то строчечек. Просто сперва надо выписать в табличку, которая называется матрица - блаблабла.

А - Арифметика

Строчечки, столбики - называюи вектор. Это немного путает, ну типа слово сложное. Но на самом деле, это просто массив чиселок. Итак, для того чтоб найти что строчечка a похожа на строчечку e - нам надо сравнить два вектора (звучит ебловато, понимаю). Для сравнения векторов - применяется формула косинусной похожести. Сейчас будет код:

//Cosine return cosine similarity
func Cosine(a, b map[string]float64) (sim float64) {
vec1, vec2 := vector(a, b)

var product, squareSumA, squareSumB float64

for i, v := range vec1 {

product += v * vec2[i]
squareSumA += v * v
squareSumB += vec2[i] * vec2[i]
}

if squareSumA == 0 || squareSumB == 0 {
return 0
}

return product / (math.Sqrt(squareSumA) * math.Sqrt(squareSumB))
}

Comments

Be the first to add a comment