четверг, 20 октября 2016 г.

Типы данных

Урок: Типы данных

Транскрибация урока: В этом видео мы познакомимся с типами данных в «Питоне». И начнем, конечно, с числовых типов данных. Допустим, нам нужно завести переменную, в которой будет некоторое целое число, ну, например, количество чего-нибудь. Ну это очень просто. Давайте ее выведем на печать теперь и посмотрим ее тип. Тип у нее int. С int-овыми переменными можно выполнять некоторые простые операции: складывать, умножать, делить. При этом, если результат сложения и умножения был действительно предсказуем, то результат деления может вас немного удивить. На самом деле, все достаточно логично. Если мы разделили int-овое число на int-овое число, то должны были получить тоже int, поэтому здесь деление целочисленное. Если мы попробуем поделить отрицательное число, то получим вот такой вот ответ. Если же вы хотите получить −1 в данном примере, то нужно взять деление 5 на 4 в скобки. Тогда сначала произойдет это деление, а потом уже будет умножение на −1. Кроме того, может быть, вам придется работать с достаточно большими числами. Большие числа будут, скорее всего, иметь тип long, но так как в «Питоне» динамическая типизация, и в одну переменную можно записать сначала один тип, потом другой, (вот давайте это проверим для нашего примера с большим числом), то можно особо не переживать из-за того, какой же там тип, int или long. Ну и, конечно, в «Питоне» есть дробные числа. Они представлены типом float. С ними тоже можно делать простые операции: сложение, умножение, деление. Ну и, конечно, здесь уже деление не целочисленное. И отсюда возникает идея: если вам нужно получить нецелочисленное деление, а аргументы у вас целые, то можно попробовать каждый аргумент привести к типу float. Но тогда получится действительно дробный результат. И при этом можно лишь один аргумент приводить к типу float, потому что в таком случае результат будет таким, чтобы вроде как ничего ценного не потерялось. Ну а раз один из аргументов — действительно дробное число, то, наверное, логично, что и результат должен быть дробным. Кроме того, в «Питоне» есть логический тип данных, bool, я его рассказываю вместе с числовыми, ну хотя бы потому, что bool легко можно привести к типу int, ну и потому, что если мы попробуем поскладывать разные значения, то мы получим вот такой вот интересный результат. То есть, оказывается, true + true будет равно двум. Ну, в самом деле, если мы приведем к int, то мы убедимся, что true это у нас единичка, а false это у нас 0. Кстати, обратите внимание, true и false в «Питоне» пишутся с большой буквы. Ну а здесь при сложении у нас сначала произошло неявное приведение к типу int. Ну и, конечно, есть обычные привычные операции с логическим типом. Это операция «и», «или». Давайте убедимся, что результаты такие, как обычно и продолжим дальше. В «Питоне» есть тип none. Это не 0 и не false. Это специальный тип, который означает отсутствие значения, у него даже свое название типа: NoneType. И его, конечно же, не получится привести к какому-то другому типу. Но как один из примеров того, откуда может взяться none, можно присвоить какой-нибудь переменный результат вычисления функций, которая ничего не возвращает. О функциях мы еще поговорим подробнее в следующем видео. Ну и, конечно, вы можете записывать переменные строки. Для этого есть тип str. С ним тоже есть какие-то простые операции, тоже можно складывать, но для строк сложение означает уже дописывание к одной строке другой строки. Можно приводить к нижнему регистру или к верхнему регистру. Можно получить длину строки. Можно привести к типу bool, если строка имеет не нулевую длину, то есть не пустая строка, то результат будет true. В противном случае, то есть для пустой строки, результат будет false. Ну и, конечно, приводить к числовому типу уже не получается. Можно получать различные элементы строки (ну вот здесь вот мы получили нулевой и первый элемент) или делать срез, то есть получать некоторый диапазон элементов. Смотрите, здесь мы сделали срез с нулевого по третий элемент. Третий элемент в итоге не включается. Ну и в срезе можно использовать еще один параметр. Это шаг. В этом случае мы получаем нулевой элемент, затем 0 + 2 получается элемент с индексом 2. Ну и 2 + 2 уже получается 4, а мы идем до 4 не включая. Вот поэтому получается такой результат. Есть еще один тип данных для строк, это unicode. Для этого вам нужно дописать перед строкой u. И вот, действительно, получается тип данных unicode. Но если вы знакомы с кодировками, то, конечно, вы понимаете, зачем может понадобиться этот тип данных. Ну, кроме того, любопытно, как переходить от типа unicode к типу str. Ну давайте объявим некоторую юникодную строку, посмотрим, что действительно она юникодная, и применим метод encode для того, чтобы получить str, и укажем кодировку utf8. Выведем на печать и увидим, что все хорошо. encode действительно делает из юникодной строки str. Ну а операция decode делает из str юникодную строку. При этом обратите внимание, если мы неверно укажем кодировку, ну, например, cp1251, которая, как правило, используется в Windows, то мы получим немного странный результат. Можно подумать, что можно было просто явно привести к типу str, но это неправда, действительно, ничего не срабатывает. Ну и на всякий случай, если вы не очень плотно знакомы с кодировками, давайте посмотрим, что будет, если мы в той строке, которая имеет тип str, возьмем срез с первого элемента. Вот смотрите, первая буква у нас почему-то сломалась. И, кстати, если мы посмотрим на длину строки, то для типа str она получилась одна, а для типа unicode другая. Дело вот в чем. Некоторые символы кодируются двумя байтами, некоторые — одним байтом. Тип данных unicode знает об этом, тип данных str не знает, и поэтому когда мы выводим длину для объекта типа str, то мы получаем несколько большее число, потому что некоторые буквы считались, получается, 2 раза. Ну и, кроме того, когда мы сделали decode с неправильной кодировкой, нам еще очень повезло. Ну вот смотрите. Допустим, у нас есть юникодная строка, вот мы сделали encode, получили str. Ну и теперь давайте попробуем сделать decode с правильной кодировкой. Все работает. А теперь попробуем сделать с неправильной. И, смотрите, в этом случае уже все сломалось. То есть просто та строка была более удачной для такого рода ошибки. Ну, как вы видите, бывают ситуации, когда мы получаем сообщение об ошибке, бывают ситуации, когда мы не получаем сообщение об ошибке и как-то неправильно декодируем. Конечно, это один из основных камней преткновения в выборе между вторым «Питоном» и третьим «Питоном», и многие сторонники третьего «Питона», в котором такой проблемы нет, и в котором один тип для строк, приводят это как аргумент в пользу третьего «Питона». Но на самом деле и за тот, и за другой аргументов много, и выбор — это скорее вопрос вкуса. Выбирайте то, что вам больше нравится, но мы продолжим для единообразия повествования на втором «Питоне». Итак. Давайте посмотрим еще на одну операцию. Это операция split. Она разбивает строчку по какой-то другой строке. Кстати, обратите внимание, я еще не делал замечания, но строки в «Питоне» можно писать как в двойных кавычках, так и в одинарных кавычках, и вот это достаточный результат. Теперь мы получили какой-то объект, который имеет тип, с которым мы до этого не сталкивались. Давайте посмотрим на его тип. Тип list. Забегая вперед, скажу, что это массив, и это не имеет никакого отношения к спискам из алгоритмов и структур данных. Ну и давайте попробуем сделать то же самое для русского текста. И увидим, что когда мы выводим массив с русскоязычными строчками, то мы получаем не очень читаемый вид. Давайте попробуем напечатать вот какой–то один фрагмент, видим, что это получается буква И. Вот, когда мы отсекли первый элемент, мы фактически попытались убрать вот эту часть, ну, действительно, получается что-то другое, ну а если мы делаем то же самое с юникодной строкой, то здесь уже кодируется немного по-другому. Ну раз уж мы столкнулись с массивом, давайте познакомимся с массивами. Одним из типов для массивов — это list. Ну что мы можем хранить в массивах? Мы можем хранить какие-то числа, ну, например, количество проданных товаров в разные дни, можем хранить какие-то строчки, например, уровень дохода разных людей, которые хотят взять кредит или брали когда-то кредит, или их имена. Ну и здесь мы опять получили какой-то не очень читаемый вывод, поэтому давайте воспользуемся методом join, который есть у строчек и позволяет просто соединить элементы массива какой-то другой строкой. Давайте посмотрим, что получится. Ну, если б мы взяли не пробел, а что-нибудь другое, то получилось бы вот так. Ну в дальнейшем, чтобы не заморачиваться с выводом, будем использовать английские символы, ну эта проблема, как вы видите, решается несложно. list позволяет хранить объекты разных типов. Зачем это может быть нужно? Ну, например, если вам нужно хранить описание опять-таки людей, которые брали когда-то кредиты, то у вас разные параметры могут иметь разные типы, ну, например, имя будет строковым параметром, время, на которое хочется взять кредит будет числом, а вернул или нет может быть булевским параметром. Ну и давайте посмотрим, как работает индексация. Индексация работает также как в строчках, мы действительно получаем элемент какой нужно по индексу, действительно можем делать срез также, как в строчках, можем делать срез до какого-то элемента или от какого то элемента, и можем использовать индексацию с конца массива. Также можем добавлять элемент массива с помощью метода append и удалять элементы. Кроме того, есть еще один тип данных для массивов — это тип данных tuple. Давайте его создадим, проверим, что работают те же операции среза, ну и попробуем добавить элементы. Здесь все закончилось не очень удачно, мы получили сообщение об ошибке, выяснили, что атрибута append вообще нет, и у нас, естественно, возникает вопрос: зачем же нужен такой массив, в который нельзя добавить новый элемент? Давайте продолжим и вскоре мы узнаем, зачем же нужен tuple. Итак, кроме того, в Python есть другие типы данных, а именно — множества и словари. Ну давайте начнем с множеств. Допустим, вы хотите создать переменную в которой будут храниться разные имена людей. Давайте убедимся что это set. Вот как вы видите в Python можно использовать не только квадратные скобки и круглые для объявления разных типов данных, но еще и фигурные, но и давайте посмотрим что получится, если мы проверим наличие какого-то элемента множеств. Вот мы получаем булевский ответ в зависимости от того, есть элемент или его нет. Можно элемент попробовать добавить и видеть, что все успешно, можно попробовать добавить тот элемент, который уже есть в множестве и увидеть, что конечно новый элемент не появился, потому что элемент уже есть, то есть дубликата множеств нет, можно удалять элементы. Можно попробовать добавить элемент какого-то другого типа по сравнению с теми, которые уже представлены. Это можно сделать с множеством точно также как с листом, но в примере, который мы сейчас запустим, ничего не получится, и мы получим сообщение об ошибке unhashable type list. Ну за такие алгоритмы и структур данных уже могли догадаться, что это связано с тем, что множество реализовано с помощью структур данных хеш-таблицы, и поэтому нужно, чтобы от добавляемого элемента можно было взять hash, то есть, чтобы элемент был неизменяемым, но если эти слова ничего для вас не говорят, достаточно просто запомнить, что изменяемые элементы добавлять в set нельзя. Но если мы попробуем добавить tuple, то всё получится удачно. Но можно подумать, зачем нам нужно множество? Могли бы просто содержать какой-то массив и поддерживать то, что в массиве не будет дубликатов, ну а если нужно, пробегаться по массиву и смотреть, есть ли там элементы. Но, конечно, это будет работать намного медленнее. Для этого попробуем сравнить ситуацию: создадим массив из чисел от нуля до десяти тысяч не включая и множество с числами от нуля до десяти тысяч не включая. Это можно сделать с помощью функции range. Ну давайте убедимся, что в массиве все что нужно, выведем первый элемент и последний, ну и теперь замерим время, за которое мы можем проверить, что какой-то элемент есть в массиве и есть множество. Разница колоссальная. Ну и кроме того, есть в Python тип данных dict — это словарь. Он пригодится нам, если нужно хранить какое-то отображение из одних элементов в другие, ну, например, для каждого слова уметь быстро получать его частоту в каком-нибудь тексте. При этом можно получать элемент по какому-то ключу и как выводить его на печать, так и обновлять значения. Ну и можно создавать множество, опять же, с помощью фигурных скобок, и можно хранить в множестве разные элементы и ключом, опять-таки, должен быть неизменяемый тип, ну то есть использовать tuple в качестве ключа можно, использовать list в качестве ключа — неудачная затея. Если Вам хочется познакомиться с Python еще более подробно или послушать другие изложения, то материала по Python очень много в Интернете, есть курсы на coursera, есть codeacademy, есть другие ресурсы, некоторые из этих ресурсов по третьему 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