Библиотека Matplotlib

Линейный график

Здравствуйте и вновь добро пожаловать на занятия по теме «Инструментарий Numpy на языке Python».

В этой статье мы рассмотрим библиотеку Matplotlib. Как следует из названия, она предназначена для создания графиков. Мы уже научились представлять данные и загружать их из файла – для этого существуют Numpy и Pandas. Следующий этап – наглядное отображение данных. Для этого и существует Matplotlib.

Прежде всего мы рассмотрим линейный график. Линейный график не предназначен для отображения только прямых; в случае его использования берётся набор координат точек на координатной плоскости и отображается на экране, соединяя точки отрезками прямых. С его помощью, к примеру, мы можем отобразить такие вещи, как синусоида или парабола.

Начнём с импорта Matplotlib:

import matplotlib.pyplot as plt

Сначаласоздадим точки данных для оси x:

x = np.linspace(0, 10, 10)

Linspace – это ещё один способ генерации данных, с которым мы пока не встречались. У него есть три аргумента: начальная точка, конечная точка и количество точек между ними. Создадим теперь синусоиду:

y = np.sin(x)

Незабывайте, что эта операция происходит поэлементно – берётся каждое значение x и подставляетсяв функцию синуса. Теперь мы можем отобразить синусоиду:

plt.plot(x, y)

plt.show

И получаем синусоиду. Заметьте, что для того чтобы действительно вывести на экран график, необходимо вызвать функцию show. Это сделано для того, чтобы можно было добавлять другие элементы к графику перед его непосредственным выводом на экран. Так и сделаем:

plt.plot(x, y)

plt.xlabel(“Time”)

plt.ylabel(“Some function of time”)

plt.title(“My cool chart”)

plt.show()

Получилсяновый график с подписями.

Каквы могли заметить, график получился ломанным и не слишком похожим на синусоиду.Это связано с тем обстоятельством, что задано всего 10 точек, которыесоединяются отрезками прямой. Надо помнить, что все вычисления являютсядискретными, даже пиксели на вашем мониторе – их на мониторе конечноеколичество, так что достаточно внимательно присмотревшись, вы увидите лишьпо-разному окрашенные точки.

Сделаемтакое же упражнение, но с большимколичеством точек. Диапазон по-прежнему между 0 и 10, но между ними будет 100точек. Всё остальное остаётся прежним:

x = np.linspace(0, 10, 100)

y = np.sin(x)

plt.plot(x, y)

plt.show

Получаем куда более гладкий график.

Диаграмма рассеяния

Теперь рассмотрим другой популярный способ отображения, называемый диаграммой рассеяния.

Выше мы рассматривали точно определённую функцию. Однако в машинном обучении у нас есть набор данных, но неизвестна точная функция, которая стоит за этими данными. Кроме того, к этой основополагающей функции может быть примешан шум (помехи). Поэтому в машинном обучении  мы стараемся найти приближённую функцию. В этой лекции мы вернёмся в папку linear_regression_class и рассмотрим данные из неё.

Яуже нахожусь в этой папке, поэтому сразу импортируембиблиотеку Pandas и загружаем данные из файла data_1d.csv, указав, что в нём нет заголовков и сразупреобразовав в матрицу:

import pandas as pd

A = pd.read_csv(‘data_1d.csv’, header=None).as_matrix()

Координатыпо оси x– это первый столбец, координаты по оси y – второй. Так и отметим:

x = A[:,0]

y = A[:,1]

Двоеточиеозначает, что нужно выбрать всё в данной размерности. Поскольку перваяразмерность представляет строки, где каждая строка является примером, этозначит, что выбраны все примеры, но только из одного столбца. Теперь мы готовысоздать диаграмму рассеяния:

plt.scatter(x, y)

plt.show

И получили почти что прямую. Отметим, что у функции scatter есть и другие полезные аргументы, которые можно использовать, но я буду приводить их лишь по мере надобности. Прямо сейчас же они нам не нужны. Это не стоит запоминать, их можно просмотреть, когда появится необходимость. Не забывайте, что при создании графика на экран ничего не выводится, пока мы не вызовем функцию show. Это значит, что до её вызова мы можем добавлять элементы к графику. Мы знаем, какая прямая соответствует нашей диаграмме, поэтому давайте отобразим их вместе, чтобы показать, что прямая действительно соответствует:

x_line = np.linspace(0, 100, 100)

y_line = 2*x_line + 1

plt.scatter(x, y)

plt.plot(x_line, y_line)

plt.show()

Теперь диаграмма и прямая отображены вместе; мы видим, что прямая действительно соответствует диаграмме.

Гистограмма

Давайте рассмотрим другой популярный способ отображения данных, который называется гистограммой.

Посути, гистограмма представляет собой лишь дискретное представлениераспределения вероятностей данных или, другими словами, частоты в каждомсегменте значений.

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

plt.hist(x)

plt.show

Иполучаем гистограмму по оси x. Она показывает, сколько точек по оси x находится вкаждом сегменте.

Ранеея утверждал, что функция random даёт равномернораспределённые данные. Вам может быть интересно, можно ли это нагляднопоказать? Давайте попробуем.

R = np.random.randn(10000)

plt.hist(R)

plt.show

Видполучается довольно равномерный.

Вфункцию hist  можновставить и другой аргумент, определяющий количество сегментов. По умолчанию ихколичество равно 10, но предположим, что нам нужно 20 сегментов. Тогда

plt.hist(R, bins=20)

plt.show

Теперьу нас 20 сегментов. Распределение всё ещё равномерное, хотя и не настолькоравномерное, как перед этим. Но не забывайте, что это случайное распределение,так что не получится в точности равного количества примеров в каждом сегменте,если не добавить гораздо большее количество примеров.

Рассмотримещё один пример с гистограммой. В случае линейной регрессии предполагается, чтоошибка имеет нормальное распределение: если мы возьмём все фактические значенияy и отнимем отних соответствующие значения точек, лежащих на искомой прямой, то данные будутиметь нормальное распределение. Проверить, имеет ли место такое распределение,можно с помощью гистограммы, и для этого у нас есть всё необходимое. Так и сделаем:

y_actual = 2*x + 1

residuals = y – y_actual

plt.hist(residuals)

plt.show()

Итак, имеем гистограмму более-менее колоколообразной формы. Но поскольку у нас всего 100 точек, то график и не должен быть очень точным.

Вывод изображений

Когдавы видите в компьютере файл изображения, вы можете решить, что это чудо, но вдействительности изображение – это лишь матрица чисел. Каждое значение вматрице отображает интенсивность свечения пикселя в данной позиции изображения.Разумеется, открывая файл в формате JPEG или PNG, мы не видим этих чисел, поскольку данные форматыизображений используют сжатие. Однако распаковав изображение, мы получимобратно матрицу чисел.

Рассматриваемые нами изображения будут из знаменитой базы данных MNIST. Это небольшие изображения написанных от руки цифр. Формат изображений также позволит нам изучить ещё несколько функций Numpy. Чтобы достать данные, необходимо перейти по адресу https://kaggle.com/c/digit-recognizer и нажать на ссылку Data. Конкретно в данной лекции будет использоваться файл train.csv. Кроме того, в большинстве примеров из моего курса, когда возникает необходимость использовать огромный файл данных, как в нынешнем случае, лучше не хранить его в репозитарии Github, так как его загрузка займёт очень много времени. Лучше хранить его в соседней с курсом папке, которой обычно даётся название large_files. Так что убедитесь, что train.csv находится именно там.

Есливы заглянёте непосредственно в csv-файл, тоувидите, что он имеет довольно длинную строку заголовков. Первый столбец – этометка, которая в данном курсе нам не понадобится, а все остальные столбцы – этопиксели. Как вы можете заметить, всего есть 784 пикселя – от 0 до 783. Этосвязано с тем, что имеющиеся изображения имеют размер 28×28, а если 28 умножить на 28, получится 784. Сами изображениясглажены в вектор в связи с необходимостью хранить их в формате CSV.

Вернёмсяк нашему коду. Импортируем библиотеку Pandas и загружаемнаши данные.

import pandas as pd

df = pd.read_csv(“../large_files/train.csv”)

Этозанимает некоторое время, поскольку набор данных довольно велик. Мы можемпроверить форму датафрейма, чтобы узнать его размер:

df.shape

Итак,у нас 42000 примеров и 785 столбцов, один из которых – это метки. Преобразуемвсё это в матрицу:

M = df.as_matrix

Незабывайте, что наша цель – вывести на экран изображение. Первое из них в набореданных мы можем получить так:

im = M[0, 1:]

Этозначит, что мы выбираем нулевую строку, то есть нулевой пример, и выбираем всестолбцы, кроме нулевого, поскольку знаем, что это не пиксель. Проверимразмерность:

im.shape

Иполучаем, как и ожидалось, вектор размерности 784. Но на самом деле нам нужнаматрица 28×28, представляющая изображение. К счастью, как раздля таких случаев в Numpy есть функция reshape. Её и вызовем:

im = im.reshape(28, 28)

Навсякий случай проверим ещё раз форму:

im.shape

Теперьмы готовы вывести изображение:

plt.imshow(im)

plt.show

Нарисунке нечто, очень похожее на единицу. Проверим метку:

M[0,0]

Иэто действительно единица. Заметьте, как странно выглядели цвета – изображениебольше походило на инфракрасный снимок, нежели на рисунок. Если нужноотобразить изображение в чёрно-белом виде, что было бы естественно, можносделать следующее:

plt.imshow(im, cmap=’gray’)

plt.show

Теперьизображение является чёрно-белым. При этом чёрный цвет соответствует значениюпикселя, равному нулю, а белый – значению пикселя, равному 255. Обратитевнимание, что можно вывести изображение и в инвертированном виде, когда цифрастанет чёрной, а фон – белым. Это будет естественнее выглядеть. Для этого нужноуказать

plt.imshow(255 – im, cmap=’gray’)

plt.show

Теперьу нас есть чёрное изображение на белом фоне.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: