пятница, 21 октября 2016 г.

Циклы, функции, генераторы, list comprehension

Урок: Циклы, функции, генераторы, list comprehension

Транскрибация урока: [БЕЗ_ЗВУКА] В этом видео мы познакомимся с некоторыми простыми конструкциями языка «Питон» и начнем привыкать к его синтаксису. Итак, давайте разберемся с условным оператором. Точно так же, как и в других языках программирования, здесь можно написать что-нибудь в духе… там… давайте заведем какую-то переменную… напишем, пусть она равна true, и напишем if x… print… ok… Если мы хотим рассмотреть другой случай, то пишем else: и что-нибудь еще. Проверяем. Да, все хорошо. Если сейчас поменяем на false, все работает так, как нужно. Теперь обратите внимание, если во многих других языках программирования, когда мы пишем какую-то такую конструкцию, дальше тело следует в каких-нибудь скобочках, в «Питоне» для этого используются отступы. Отступы должны быть единообразными. Вот я здесь просто отступил на Tab, а если мы продолжаем тело, то нужно писать опять-таки тоже с отступом. Давайте еще что-нибудь напишем и посмотрим, что все хорошо, все работает. Ok. Теперь давайте разберемся с чем-нибудь еще. Ну, например, с циклами. Циклы встречаются, наверное, почти что в каждой программе. И давайте напишем простой цикл, в котором будем выводить числа от 1 до 10. For i in range (10), и опять же так же с отступом пишем print i. Давайте посмотрим, что получится. Ну смотрите. Вывелись числа 0, 1, ..., 9. То есть такая конструкция приводит к тому, что мы получаем все числа от 0 до 9 включая, то есть 10 не входит в этот интервал. При этом мы могли бы написать, ну, например, вот таким вот образом, и задать первое число. Тогда бы мы получили число от 1 до 9, и обратите внимание: когда мы делаем print, сразу же происходит перевод на следующую строку. Если мы хотим от этого избавиться, мы можем поставить здесь запятую, и тогда все это будет выведено через пробелы. Теперь давайте чуть подробнее изучим, что же такое range. Давайте просто сделаем print range от 2 до 5. Вот мы видим, что это просто какой-то список. И отсюда у нас возникает мысль, что может быть в «Питоне» можно писать каким-нибудь таким образом: for i in, давайте прям напишем список, print i. На самом деле так и есть, оказывается в «Питоне» циклы у нас устроены не таким образом, что мы обязательно в каком-то диапазоне значений пробегаемся, а мы просто пробегаемся по какому-нибудь контейнеру с элементами. Ну, например, по списку. То есть если мы возьмем и посмотрим type от range, то мы сразу же обнаружим, что это просто список. Сразу расскажу еще одну интересную вещь. Мы могли бы написать не range, а xrange, ну и то же самое, и увидеть, что результат абсолютно тот же. Возникает естественный вопрос — а зачем же нужно два способа добиться одного и того же результата? На самом деле результат не совсем один и тот же. Оказывается, если мы посмотрим тип xrange, то мы увидим, что xrange имеет тип xrange. Ну хорошо. Яснее нам не стало, но мы поняли, что это не список. Давайте еще напечатаем: xrange, [БЕЗ_ЗВУКА] ну, здесь мы видим чуть больше конкретики, но по прежнему остается некоторая загадка. Оказывается, xrange — это естественный пример генератора. А генератор не представляет из себя сразу готовый список различных значений, а генерирует их прямо на ходу. То есть у вас в памяти не хранится длинный список, как если вы напишите range и какое-то большое число. Ну вот, например, так. Если вы пишите for i in range от чего-то большого, то лучше всё же написать xrange. Так, давайте чуть подробнее познакомимся с генераторами, но для этого сначала мы изучим вещь, которая называется list comprehension. Оказывается, в «Питоне» очень многие вещи можно писать буквально в одну строчку. Ну, давайте попробуем вывести числа от 1 до 10 в массиве, и возведя их в квадрат. Можно просто взять написать print, квадратные скобочки, и в квадратных скобочках мы прямо пишем — x в квадрате for x in range 1 до 10 включительно, наверное, давайте выведем, так что 1, 11. Нажимаем и видим — да, действительно, результат. Ну, теперь давайте попробуем оставить из них только четные. Для этого достаточно дописать if x % 2 = 0. Дописываем, пожалуйста — остались только четные из них. Теперь давайте не будем это выводить на печать, а просто создадим объект, который будет равен вот этому всему. Сделали, теперь посмотрим тип. [БЕЗ_ЗВУКА] Ну, как мы видим, тип этого объекта — список, и здесь у нас возникает опять же вопрос — а как бы нам сделать не список, а генератор? То есть не хранить сразу все эти значения в памяти. Оказывается, для этого достаточно заменить квадратные скобочки на круглые, давайте посмотрим, что получилось. И вот, действительно, тип — генератор. Таким образом, range отличается от xrange ровно тем, чем в этом выражении отличаются квадратные скобочки от круглых. Ну, давайте теперь выясним, что у нас есть еще какие-то способы написать цикл. Ну, например, давайте скажем, что x = true, а while x, заведем какую-нибудь переменную, будем внутри цикла ее инкрементировать, и if s > 10, сделаем break, то есть завершим цикл. Ну и давайте всё это будем печатать. print s. Ну, оказывается, такой цикл тоже можно делать. В цикле, да, можно использовать break, можно использовать continue, которое приводит сразу же к переходу на следующею итерацию. Ну, давайте напишем так: if s % 2 = = 0, сделаем continue и посмотрим, как это отразится на выдаче. Угу-угу. Ну, вот мы видим, что вроде бы никак существенно не отразилось. Давайте попробуем понять, почему. [БЕЗ_ЗВУКА] Для этого попробую переставить в другое место. [БЕЗ_ЗВУКА] Ну и вот видите, мы получили нечаянно бесконечный цикл. Потому что мы просто проверяем, что остаток от деления на 2 равен нулю до того, как изменяем переменную s, и это условие у нас выполняется постоянно, и мы всё время делаем continue. Давайте проведем исполнение этого кода, вернем обратно. [БЕЗ_ЗВУКА] Ну? давайте, если это условие выполнилось, тоже что-нибудь напишем. Вот, смотрите. В этой ситуации мы получили следующий эффект. Мы просто делаем переход на следующую итерацию, в случае если s четное, и ничего не печатаем. Почему же в первый раз у нас получилось не совсем так? Ну просто вот это выражение у нас было написано после print s, поэтому вывод действительно не отличался. ну и давайте теперь познакомимся с функциями в Python, допустим, нам нужно реализовать, ну, например, свой range. Давайте напишем def myrange, пусть, опять же будут 2 переменные, a и b, от которых зависит результат, и также с отступом пишем return, и здесь напишем list comprehension, x for x in... ах, нет, тогда нам придется использовать range, наверное, это не очень хорошо. Давайте тогда просто создадим список, и напишем for... или даже так... while s не равно b, будем добавлять список с помощью метода append (s) и увеличивать s на единичку. Ну и давайте посмотрим, будет ли это все работать, и как. print myrange. Ну, вроде похоже на правду. Конечно, можно было бы еще подумать о каких-то особых ситуациях, когда мы будем давать не совсем подходящие числа на вход, но это не является нашей целью сейчас. Сейчас наша цель — просто познакомиться с синтаксисом. Синтаксис функций мы уже увидели. И давайте напоследок я расскажу еще об одной интересной вещи. Оказывается, нам необязательно писать что-то в духе x в квадрате for x in range (10), если мы хотим получить квадраты первых 10 чисел. Оказывается, тот же результат можно получить с помощью функции map. Функция map просто применяет некоторую функцию к контейнеру. Давайте опять напишем print map. Здесь напишем range (10), но какую функцию мы будем применять? Нам хочется возводить в квадрат, ну, давайте сразу определим функцию возведения в квадрат. [ПЕЧАТАЕТ] И ее и подставим в map. Ну да, так работает, но на самом деле есть еще одна удобная вещь, можно функции определять прямо на ходу с помощью так называемых λ-выражений. Ну, например, мы можем написать map точно так же написать range (10), а в качестве первого аргумента напишем следующую вещь: λ, дальше пишем переменную, x, дальше двоеточие, и пишем то, что нужно возвращать – x в квадрате. Посмотрим на результат. Да, все так, как нужно. Если нам нужно ввести функцию от нескольких переменных, то мы можем перечислить их здесь через запятую и использовать их. Каким-нибудь вот таким вот образом. Ну и здесь, конечно, этот код не заработает, потому что у нас подается на вход одна переменная. Итак, мы познакомились с основными конструкциями языка Python. В следующем видео вы узнаете о том, как читать из файла и как записывать файл.

Часть: Знакомство с синтаксисом Python

Модуль: Введение

Описание модуля: Добро пожаловать! На этой неделе мы начнём осваивать язык Python — один из главных инструментов специалиста в науке о данных, и вспомним кое-что о производных, которые активно используются при настройке моделей машинного обучения.

Курс: Математика и Python для анализа данных

Описание курса: Анализ данных и машинное обучение существенно опираются на результаты из математического анализа, линейной алгебры, методов оптимизации, теории вероятностей. Без фундаментальных знаний по этим наукам невозможно понимать, как устроены методы анализа данных. Данный курс направлен на то, чтобы сформировать этот фундамент. Мы обойдёмся без сложных формул и доказательств и сделаем упор на интерпретации и понимании смысла математических понятий и объектов.

Для успешного применения методов анализа данных нужно уметь программировать. Фактическим стандартом для этого в наши дни является язык Python. В данном курсе мы предлагаем познакомиться с его синтаксисом, а также научиться работать с его основными библиотеками, полезными для анализа данных.

В этом курсе вы познакомитесь с фундаментальными математическими понятиями, необходимыми для анализа данных, и получите начальный навык программирования на Python. Курс состоит из двух больших частей. Первая часть курса – практическая, она посвящена языку программирования Python. Вы познакомитесь с синтаксисом и идеологией языка, научитесь писать простые программы. Также вы узнаете о библиотеках, которые часто применяются на практике для анализе данных, например, NumPy, SciPy, Matplotlib и Pandas. Вторая часть курса посвящена таким разделам математики как линейная алгебра, математический анализ, методы оптимизации и теория вероятностей. При этом, упор делается на разъяснение математических понятий и их применение на практике, а не на вывод сложных формул и доказательство теорем.

Программа:
  • Введение
  • Знакомство с курсом
  • Python, уровень 0
  • Знакомство с синтаксисом Python
  • Производная и её применения
  • Немного обсуждений
  • Библиотеки Python и линейная алгебра
  • Библиотеки NumPy, Matplotlib, SciPy, Pandas
  • Линейная алгебра. Векторы
  • Линейная алгебра. Матрицы
  • Оптимизация и матричные разложения
  • Градиент и оптимизация гладких функций
  • Оптимизация негладких функций
  • Матричные разложения
  • Случайность
  • Вероятность и случайные величины
  • Статистики
  • Бонусный урок
Описание преподавателя:
  • Евгений Рябенко — кандидат физико-математических наук, доцент кафедры "Интеллектуальные системы" ФУПМ МФТИ, Data Scientist Фабрики данных Яндекса. Соавтор и преподаватель курса "Прикладной статистический анализ данных", который читается в МФТИ, МГУ и ВШЭ. Занимается анализом данных, био- и нейроинформатикой, кормит синиц.
  • Евгений Соколов — руководитель группы анализа неструктурированных данных в Yandex Data Factory. Окончил факультет ВМК МГУ в 2013 году, сейчас пишет диссертацию про матричные разложения в аспирантуре там же. Ведет практические занятия по машинному обучению на ВМК МГУ и читает лекции на ФКН ВШЭ. Преподаватель Школы Анализа Данных Яндекса.
  • Виктор Кантор – старший преподаватель кафедры “Алгоритмы и технологии программирования” ФИВТ МФТИ, руководитель исследовательской группы Yandex Data Factory. Ведет лекции и семинары в МФТИ на кафедрах “Алгоритмы и технологии программирования”, “Анализ данных”, “Банковские информационные технологии”, “Компьютерная лингвистика” и “Распознавание изображений и обработка текстов”.
  • Эмели Драль – преподаватель ШАД и руководитель исследовательской группы Yandex Data Factory. Окончила РУДН, факультет физико-математических и естественных наук, кафедра “Информационные технологии”. Разрабатывала учебные материалы и вела такие курсы как “Технологии разработки программных систем”, “Объектно-ориентированный подход к разработке программных систем”, “Методы интеллектуального поиска”. В МФТИ ведет семинары курса "Машинное обучение" на ФИВТ, кафедра “Алгоритмы и технологии программирования”.
Категория: Наука о данных

Описание категории: На специализациях и курсах по науке о данных преподаются основы интерпретации данных, проведения различных видов анализа, понимания и представления практических выводов. Начинающие и продолжающие учащиеся освоят такие темы, как качественный и количественный анализ данных, инструменты и методы манипулирования данными, а также алгоритмы машинного обучения.

Тематика: Анализ данных

Материал:



Список литературы

Линейная алгебра
Виктор Кантор:
  • Ильин, Ким. Линейная алгебра и аналитическая геометрия (1998) — МГУ.
  • Умнов. Аналитическая геометрия и линейная алгебра (2011) — МФТИ.
Евгений Рябенко:
  • Деммель. Вычислительная линейная алгебра. Теория и приложения (2001) — понятный кусок про матричные разложения.
Математический анализ
Виктор Кантор:
  • Ильин, Позняк, Основы математического анализа (2005) — МГУ.
  • Тер-Крикоров, Шабунин. Курс математического анализа (2001) — МФТИ, много примеров.
  • Иванов. Лекции по математическому анализу (2000) — МФТИ, очень короткое, но полное изложение.
Методы оптимизации
Евгений Рябенко:
  • Нестеров. Методы выпуклой оптимизации (2010) — математически строгое введение в оптимизацию от живого классика.
  • Boyd, Vandenberghe. Convex Optimization (2004) — идеальная книга по классической оптимизации, много интересных постановок задач.
  • Schneider, Kirkpatrick. Stochastic Optimization (2006) — стохастическая оптимизация во всём многообразии.
Теория вероятностей и статистика
Евгений Соколов:
  • Dekking, Kraaikamp, Lopuhaa, Meester. A Modern Introduction to Probability and Statistics, Understanding Why and How (2005) — доступная книга, описывающая базовые понятия, теоремы и методы; разбирается очень много примеров, тесно связанных с задачами машинного обучения и анализа данных.
Виктор Кантор:
  • Лагутин. Наглядная математическая статистика (2007) — в основном статистика, но есть и небольшое введение в теорию вероятностей. Стоит читать, кроме глав про классификацию и анализ данных, там изложение не слишком современно.
  • Чжун, АитСахлиа. Элементарный курс теории вероятностей. Стохастические процессы и финансовая математика (2007) — очень простое изложение.
  • Отличные лекции с мехмата Новосибирского Государственного Университета: http://www.nsu.ru/mmf/tvims/chernova/tv/tv_nsu07.pdf — теория вероятностей, http://www.nsu.ru/mmf/tvims/chernova/ms/ms_nsu07.pdf — математическая статистика.
Евгений Рябенко:
  • Diez, Barr, Çetinkaya-Rundel, Dorazio. Advanced High School Statistics (2015) — вводная книга, программа соответствует типичному курсу Statistics 101 хорошего западного университета.
  • DasGupta. Probability for Statistics and Machine Learning: Fundamentals and Advanced Topics (2011) — для смелого читателя, рассматриваются в том числе достаточно высокоуровневые методы.
Python
Эмели Драль:
  • Классические руководства по Python: https://docs.python.org/2/tutorial/ (2.7), https://docs.python.org/3/tutorial/(3.5)
  • Reitz. The Hitchhiker’s Guide to Python http://docs.python-guide.org/en/latest/ — довольно полное руководство, в котором рассматриваются вопросы от установки, работы с виртуальным окружением и работы в различных IDE до основных структур языка с примерами кода.
  • Google python class https://developers.google.com/edu/python/ — небольшой бесплатный онлайн-курс по Python для слушателей с минимальным опытом программирования.
Книги, для тех, кому захочется основательно изучить Python:
  • Lutz. Learning Python (2013) — с этой книги можно начинать изучение, она покрывает все основные структуры языка.
  • Lutz. Python Pocket Reference (2015) — подробный справочник.
Конспекты
https://drive.google.com/open?id=0B4sIH7qjgc24cVh0aTNnMEM0eXc

Интересные ресурсы
Ресурсы по материалам 1 недели:
Здесь http://bit.ly/29hALFk вы можете узнать, какие языки программирования сегодня являются самыми востребованным. Интересно, какое место в рейтинге занимает python?

Многие часто спрашивают, почему мы выбрали для специализации python, а не R? Мы подошли к выбору со всей ответственностью, рассмотрели плюсы и минусы обоих вариантов и остановились на python, в первую очередь, из-за простоты изучения, читаемости кода и универсальности языка. Здесь вы можете почитать статью о сравнении языков python и R http://bit.ly/29lkL5z

Ресурсы по материалам 2 недели:
На второй неделе курса Вам предстоит знакомство с библиотекой Pandas для работы с данными в виде таблиц, SciPy и NumPy для работы со статистикой, линейной алгеброй, оптимизационными задачами, а также Matplotlib для визуализации данных. Эти библиотеки очень функциональны, просты для изучения и популярны в мире анализа данных. Они настолько широко распространены, что часто можно встретить их использование для вот таких необычных задач: Python и красивые ножки http://bit.ly/2an3FTt

Занятное дополнение к материалам второй недели:
  • Знакомство с Python, Numpy, Scipy, Matplotlib http://bit.ly/2a4yd06
  • Курс Делфтского Технического Университета про Python и его использование в научных вычислениях http://bit.ly/29GCt4J
Ресурсы по материалам 4 недели:
Статистика — важный инструмент познания, дающий нам механизм порождения новых знаний из наблюдений за окружающим миром. Научиться им пользоваться может быть непросто; если материал лекций покажется Вам сложным, посмотрите, как понятия статистики объясняются на котиках http://bit.ly/29T53jd или в танце http://bit.ly/29PH9l5