Виртуальное собеседование на позицию ML Engineer
Решение. Часть 1.
1) Комбинаторика и ТВ (с @m1ckyro5a)
1.1. посчитайте вероятность того, что среди 5 подбрасываний честной монетки будет ровно 1 орел.
Решение: вероятность наступления 5 независимых событий - их произведение то есть (1/2)^5
1.2 посчитайте вероятность того, что первый орел выпадет на четном подбрасывании
Решение:
- вероятность 2го орла = вероятность 1й решка а второй орел = (1/2)^2
- вероятность 2k-го орла - (1/2)^(2k) = (1/4)^k
- вероятность четного орла: сумма геометрической прогрессии со знаменателем 1/4: a_0 / (1 - d) = (1/4) / (1 - 1/4) = 1/3
1.3 оцените вероятность что сумма чисел после броска 2 игральных кубиков будет 5
Решение:
Подходящие исходы: <1,4>; <2,3>; <3,2>;<4,1>
Всего исходов: 6*6.
Ответ: 4/36=1/9
1.4 Оценка максимального правдоподобия
Решение от @sultanyaril
L(a) = a / (3 ^ a) * a / (4 ^ a) * a / (5 ^ a) = a^3 / 60^a;
lnL(a) = lna^3 - ln60^a = 3 lna - a ln60
dlnL(a)/da = 3/a - ln60 = 0 -> a = 3/ln60 = 0.73272
2) Метрики и ТВ (с @m1ckyro5a)
Задача на формулу Байеса, условия были стырены из блога Дъяконова - там же можно найти и решение.
В вопросе о метриках хотелось бы услышать вопросы о балансе между False Positive и False Negative ошибках. Например если лечение очень дорогое и болезненное то FP ошибки оч нежелательны, если же ход болезни очень тяжел - то FN.
Самый популярный ошибочный ответ - AUC ROC который совсем не подходит потому что данная метрика может быть расчитана когда модель выдает некоторую вероятность или скор. В случае же бинарного предикта как в нашем случае (есть болезнь или нет) AUC ROC не имеет особого смысла. Подходят любые вариации ф-скора скошенного в сторону либо пресижена либо рекола в зависимости от ответов на наводящие вопросы выше.
3.1) Алгоритмы джуниор-миддл (с неким @sneddy)
Есть 2 строки, посчитайте сколько минимум символов нужно добавить или убавить, чтобы они стали анаграммами
Решение:
По сути задание на внимательность, знание структуры данных хэш и синтаксиса питона
В целом хотелось увидеть любое верное решение эффективнее чем через лист за квадрат
Например забить обе строки в dict отображающий символ в каунт, затем вычесть из каждого уникального каунта первого дикта каунт из второго.
Популярная ошибка: не учесть что уникальный символ может встретиться во второй строке, но не встретиться в первой.
Если использовать Counter задача превратащается в однострочник - поэтому мы просили не использовать ничего из библиотеки collections
from typing import Dict
def build_dict(input_str: str) -> Dict[str, int]:
output_dict = {}
for elem in input_str:
if elem not in output_dict:
output_dict[elem] = 0
output_dict[elem] += 1
return output_dict
def anagram_distance(s1: str, s2: str) -> int:
d1 = build_dict(s1)
d2 = build_dict(s2)
diff = 0
for elem, count in d1.items():
diff += abs(count - d2.get(elem, 0))
for elem, count in d2.items():
if elem not in d1:
diff += count
return diff