10. Baseline model revisited
Модель:
rˆuui =μ + bu + bi
argmin
p*q*b*
Σ ( 2
r−μ − b− b)
uui u i (u,i )∈R
( 2 + b2 )
i
+λ bu
Функция ошибки:
11. Baseline taxonomy
Таксономия:
дан трек i, его исполнитель artist(i) и жанры G(i)
Модель:
ˆ rui =μ + bu + Bi
argmin
p*q*b*
где Σ
Σ ( 2
r−μ − b− B)
uui u i (u,i )∈R
( 2 + B2 )
i
+λ bu
Функция ошибки:
Bi = bi + bartist (i ) +
1
G(i)
bg
g∈G(i )
12. SVD taxonomy
Таксономия:
дан трек i, его исполнитель artist(i) и жанры G(i)
Модель:
TQi
ˆ rui =μ + bu + Bi + pu
argmin
p*q*b*
Σ 2
( r−μ − b− B− pTQ)
uui u i u
i (u,i )∈R
( 2 + B2 )
i
+λ bu
2 + pu
2 +Qi
Функция ошибки:
Bi = bi + bartist (i ) +
1
G(i)
bg
Σ
g∈G(i )
где
Qi = qi + qartist (i ) +
1
G(i)
qg
Σ
g∈G(i )
14. ALS revisited
Модель:
Tqi
rˆuui = pu
argmin
p*q*b*
Σ 2
( r− pTq)
uui u
i (u,i )∈R
2 ( )
+λ pu
2
+ qi
Функция ошибки:
P-step:
pu = λnuI + Au ( )−1 du
Au =Q[u]TQ[u] = qiqi
T
Σ
i:(u,i)∈R
Σ
d =Q[u]T ru = ruiqi
i:(u,i)∈R
Q-step:
qi = λniI + Ai ( )−1 di
Ai = P[i]T P[i] = pupu
T
Σ
u:(u,i)∈R
Σ
di = P[i]T ri = rui pu
u:(u,i)∈R
22. Metric tree construction
function TreeNode kdTree(points, depth) {
int axis = depth mod k;
select median by axis from points;
TreeNode node;
node.location = median;
node.left = kdTree(points before median, depth+1);
node.right = kdTree(points after median, depth+1);
return node;
}
Работает за O(n logn)
23. Nearest neighbor search in KD tree
1. Спускаемся по дереву до листа
2. Назначаем его «лучшим»
3. Поднимаемся вверх по дереву:
1. Если текущий элемент ближе, то он становится «лучшим»
2. Проверяем, могут ли быть более близкие элементы в другом
поддереве
• Если да, то выполняем такой же рекурсивный поиск в поддереве
• Если нет — поднимаемся выше
4. Если дошли до корня, выводим «лучший»
Работает за O(logn)
26. Преобразование пространства
φ = maxi yi MIP => NN:
T ( )T
g(yi ) = φ 2 − yi
2 , yi
h(x) = 0, xT ( )T
Тогда j = argmin
i
h(x)− g(yi ) 2 = argmax
i
x ⋅ yi
То есть получилось сведение MIP к NN
Можно построить и обратные преобразования!
27. Эвристика для поиска в дереве
• Построим PCA-tree— kd-tree по осям главных
компонент
• Пронумеруем листы в дереве двоичными
числами
• Будем искать соседей только с расстоянием
Хэмминга 1
29. Locality Sensitive Hashing Family
Введем такое семейство хэш-функций H , что
x, y ∈ ℜдля любых n
если sim(x, y) > S0 то PH (h(x) = h(y)) ≥ p1
если sim(x, y) < cS0 то PH (h(x) = h(y)) < p2
Требуется и
c <1 p1 < p2
Возьмем k хэшей из H и составим мета-хэш Bi (x)
Таких мета-хэшей посчитаем L штук независимо.
30. Search for LSH
• Pre-processing:
– По всей базе посчитаем значения всех мета-хэшей
• Query:
– Посчитаем для вектора-запроса мета-хэши и вернем все исходные
вектора, у которых совпал хотя бы один мета-хэш
Поиск работает за O ( n с памяти p logn) O(n1+p )
p =
log p1
log p2
<1
31. LSH for L2
L2 =
ha,b
aT x + b
r
!
#
#
$ !" Хэш-функция из H:
ai ~ N (0,1)
b ~U(0,1)
r общая для всех
(хорошо работают маленькие)
33. Asymmetric LSH Family
Введем такое семейство хэш-функций H , что
x, y ∈ ℜдля любых n
если sim(q, x) > S0 то PH (h(Q(q)) = h(P(x))) ≥ p1
если sim(q, x) < cS0 то PH (h(Q(q)) = h(P(x))) < p2
Требуется и
c <1 p1 < p2
Дальше аналогично составим мета-хэши
и построим поиск
35. Доказательство
P(x) = x, x 2 , x 4… x 2m ( )
2…1
2 ( )
Q(q) = q, 1
2
, 1
Положим xi ≤U <1
q =1
Тогда P(x) 2 = x 2 + x 4 +…+ x 2m + x 2m+1 ( )
Q(q) 2 = q 2 +
m
4
=1+
m
4
Q(q)T P(x) = qT x +
1
2
x 2 + x 4 +…+ x 2m ( )
В итоге Q(q)− P(x) 2 = 1+
m
4
"
# $
%
& '
− 2qT x + x 2m
argmin Q(q)− P(x) 2 ≈ argmaxqT x