- PVSM.RU - https://www.pvsm.ru -

«Давайте объясню: или зачем программисту математика». Книга о том, как не скучать на лекциях по математике

TL;DR Небольшая книжка про математику для программистов. Электронный и бумажный вариант по ссылке [1].

Я преподаю в университетах уже 9 лет. За это время студенты изменились. Моё субъективное впечатление — современный первокурсник гораздо сильнее ценит своё время. В условиях свободной посещаемости даже отличники должны быть уверены в том, что конкретная лекция принесёт им пользу, сопоставимую с 1.5 часами на Kaggle или Coursera. Кажется, доступность гарантированно качественных объяснений уже убивает классический лекционный формат [2]. Поэтому вторая лекция курса у многих лекторов обычно проходит перед существенно меньшей аудиторией. В меньшей аудитории у студентов появляется больший манёвр для вопросов, и самый частый вопрос, который я слышал на парах по алгоритмам и дискретке — «Зачем?».

Зачем формулы комбинаторики? В чём прикол всех этих условных вероятностей, которые обычно объясняют на корзинах и шарах? Зачем матрицы умножать? А обратные матрицы зачем нужны? Ну ок, вот поиск в ширину, и чо?

Не сказать, чтобы во время собственного IT-студенчества я получил внятные ответы на все эти вопросы. Но опыт работы в компаниях совершенно разного типа частично приблизил меня к пониманию. На своих парах я стараюсь приводить примеры не на кошках, выстраивать не очевидные аналогии и вообще как-то приближать индустрию к математике. При этом суммарная аудитория всех моих занятий за эти годы вряд ли перевалила за 1000 человек. Поэтому я придумал собрать объяснения в кучу и написать книгу с примерами для программистов.

Ниже я приведу маленький фрагмент. Завладеть книгой в бумажном или электронном виде можно, перейдя по ссылке [1]. Отзывы приветствуются! Погнали.

Московские катки

Москва. На дворе зима, не очень холодно, солнечно. Утро воскресенья. Вы сдали зачёт или даже экзамен по линейной алгебре, и у вас есть свои коньки. Что ещё нужно для счастья?

Вы хотите на каток!

За чашкой чая вы разработали план. Вас интересуют катки, достаточно близкие к дому, но этого недостаточно, нужны ещё удобства. Лучше пусть эти катки будут бесплатные, с Wi-Fi и туалетом.

Вы назвали множество близких катков A, а удобных — B. А раз нас интересует и близость, и удобство, то наша цель — пересечение этих множеств AB. Где же нам взять эти множества?

Перебирать сайты катков или читать обзоры «Афиши» — не ваш метод. Поэтому вы отправляетесь на портал открытых данных Москвы [3], а точнее за вас это делает скрипт на языке Python, пример которого можно найти на сайте книги в документе M02 — vectors (skating) [4]. Вы обнаруживаете, что катков в Москве очень много — 1350. Как будем искать? Тут вы вспоминаете учебник по линейной алгебре и понимаете, что нужно отобразить катки на два нужных вам пространства признаков: двумерное координатное (широта, долгота) и трёхмерное — удобства (Wi-Fi, туалет, бесплатность).

Во втором пространстве наличие признака будет единицей, а отсутствие — нулём, значит, нормировать эти данные уже не нужно. Нормировать координаты мы тоже не будем, так как они в наших широтах сопоставимы (в противном случае нам пришлось бы выбрать точку отсчёта и перевести градусы в метры). А затем выбираете только самые интересные варианты — зачем вам каток, который на другом краю города или в котором заведомо нет никаких удобств? Для любого из пространств будем брать только данные с наименьшим Евклидовым расстоянием до цели.

def topN(expected, data, N):
    norms = list(map(
        lambda row, number: 
            (np.linalg.norm(row - expected), number), 
            data, 
            range(len(data))))              # пары (расстояние, индекс)
    norms.sort(key=lambda r: r[0])              # рейтинг
    return set(map(lambda r: r[1], norms[:N]))  # множество индексов

Всё готово. Осталось только подглядеть где-то наши собственные координаты (сейчас это можно сделать в любом приложении с картами) и найти все подходящие катки на
пересечении множеств A и B:

me_geo = np.array([37.676289, 55.772266])  # мои долгота и широта
me_conv = np.array([1.0, 1.0, 1.0])        # всё: Wi-Fi, туалет, бесплатно
depth = 1
A, B = set(), set()  # пока в пересечении ничего нет — расширяем поиск
while not A & B: 
    A = topN(me_geo, latlon, depth)
    B = topN(me_conv, convenience, depth)
    depth += 1
for rink in A & B:
    print(rinks[rink]["Address"])

Для данных из примера среди 30 ближайших катков получаем один каток на Старой Басманной, зато со всеми удобствами. И можно даже пешком дойти.

«Давайте объясню: или зачем программисту математика». Книга о том, как не скучать на лекциях по математике - 1

Попробуйте, используя портал открытых данных Москвы, самостоятельно найти ближайший к вам открытый Wi-Fi, летний кинотеатр или дворовые камеры видеонаблюдения.

Автор: sprotasov

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/296721

Ссылки в тексте:

[1] по ссылке: http://sprotasov.ru/math_book.html

[2] убивает классический лекционный формат: https://habr.com/post/425143/

[3] открытых данных Москвы: https://data.mos.ru

[4] M02 — vectors (skating): https://github.com/str-anger/math-book/blob/master/M02%20-%20vectors%20(skating).ipynb

[5] Источник: https://habr.com/post/427395/?utm_campaign=427395