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

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

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

Что такое Нампи?

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

Numpy предоставляет «объект многомерного массива» и набор функций, которые позволяют быстро работать с этими массивами, а также множество других математических методов. Кроме того, поддерживаются многие основные операции линейной алгебры, такие как сложение матриц, умножение, инверсия и транспонирование.

Установка и основное использование

Numpy можно установить для большинства операционных систем с помощью предварительно собранного пакета. Дополнительную информацию о доступных вариантах установки можно найти здесь.

Чтобы протестировать Numpy в интерактивной оболочке Python, вы можете просто ввести python в командной строке.

$ python
Python 3.6.5 |Anaconda custom (64-bit)| (default, Mar 29 2018, 13:14:23)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Затем вы можете легко импортировать Numpy и проверить версию, которую вы установили, с помощью следующих команд.

>>> import numpy as np
>>> np.__version__
'1.14.2'

Класс ndarray

Библиотека Numpy в основном построена вокруг класса «однородного многомерного массива», называемого ndarray. Класс ndarray реализован как «таблица» числа, состоящие из одного или нескольких «измерений», называемых осями.

ndarray можно индексировать аналогично обычному списку Python, но он позволяет создавать более сложные структуры данных, используемые многими современными алгоритмами машинного обучения. Двумя широко используемыми формами объекта ndarray в машинном обучении являются векторы и матрицы.

Векторы

Чтобы быстро создать одномерный список целых чисел, похожий на обычный список Python, Numpy предоставляет удобный метод под названием arange (обратите внимание на одиночный r в имени метода). Например, чтобы создать список целых чисел в диапазоне от 0 до 4, вы можете сделать

>>> np.arange(5)
array([0, 1, 2, 3, 4])

Такой одномерный массив часто называют вектором в большинстве литературы по машинному обучению, которую вы найдете в Интернете. Пока это не сильно отличается от обычного списка в Python, но ключевым преимуществом Numpy является то, что мы не ограничены списком с одним измерением.

Матрицы

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

Матрица A состоит из n строк и n столбцов, поэтому называется матрицей n на n. К каждому элементу матрицы A можно обратиться через переменную с двумя индексами. Например, элемент в первой строке первого столбца обозначается A11, а элемент во второй строке первого столбца обозначается A21.

Чтобы создать двумерную матрицу из 9 целых чисел в Numpy, мы можем использовать функцию reshape.

>>> np.arange(9).reshape(3,3)
array([[0, 1, 2],
      [3, 4, 5],
      [6, 7, 8]])

Numpy также позволяет нам создавать матрицы и векторы, передавая список (или несколько списков) в функцию array.

>>> v = np.array([1,2,3]) # a one dimensional vector
>>> v
array([1, 2, 3])
>>> M = np.array([[1,2,3],[4,5,6]]) # a two dimensional matrix
>>> M
array([[1, 2, 3],
       [4, 5, 6]])

Часто чрезвычайно полезно узнать форму матриц, которые мы используем в наших алгоритмах машинного обучения, и Numpy также предоставляет еще одно удобство, чтобы помочь в этом. Метод shape можно использовать для определения базовой структуры данных, с которыми вы работаете. Вызов shape для вектора v приведет к следующему результату:

>>> v.shape
(3,)

Это говорит нам о том, что вектор v имеет одно измерение и состоит из 3 элементов. В качестве альтернативы, вызов формы для матрицы M приведет к выводу, например,

>>> M.shape
(2, 3)

Отсюда мы можем сделать вывод, что матрица M имеет два измерения с 2 строками и 3 столбцами.

Двумерная матрица этой формы очень распространена в машинном обучении, поскольку мы часто структурируем входные данные для наших моделей машинного обучения в виде матрицы размера mxn, где m — количество обучающих примеров (строк), а n — это количество функций (столбцов), которые наша модель использует для формулирования своих прогнозов.

Индексация векторов и матриц

Объекты Numpy ndarray могут быть проиндексированы почти так же, как и обычные списки Python, но при индексировании матрицы необходимо учитывать еще одно измерение.

Например, если у нас есть вектор целых чисел, такой как [2,4,6,8], мы можем получить доступ к элементу с индексом 3, используя обычную запись индекса массива.

>>> v = np.array([2,4,6,8])
>>> v
array([2, 4, 6, 8])
>>> v[3]
8

Мы также можем взять часть массива так же, как и для обычного списка Python. Чтобы извлечь первые три элемента нашего вектора, мы могли бы сделать это с помощью оператора :.

>>> v[0:3]
array([2, 4, 6])

Хотя здесь нет ничего нового, это становится интересным, когда у нас есть многомерный массив, такой как матрица нескольких обучающих примеров с несколькими функциями, и мы хотим извлечь различные столбцы.

В качестве простого примера предположим, что у нас есть набор данных, содержащий 3 обучающих примера, состоящих из 5 столбцов feature и одного столбца label. Наш набор данных может выглядеть примерно так

>>> data = np.array(np.random.randint(10,size=18).reshape(3,6))
>>> data
array([[0, 8, 9, 6, 0, 6],
        [4, 2, 0, 5, 6, 4],
        [2, 1, 4, 5, 6, 8]])

При представлении этого набора данных общим первым шагом во время предварительной обработки данных для использования алгоритмом машинного обучения может быть разделение столбцов feature и столбца label на два отдельных ndarray объекты с именами X и y.

Этого можно добиться, используя простую индексацию массива.

>>> X = data[:, 0:5]
>>> X
array([[0, 8, 9, 6, 0],
       [4, 2, 0, 5, 6],
       [2, 1, 4, 5, 6]])
>>> y = data[:, -1]
>>> y
[6,4,8]

Многомерные массивы могут иметь один индекс на ось. Эти индексы даны в кортеже, разделенном запятыми. Когда мы предоставляем один : в качестве единственного значения для данного измерения, мы говорим, что нам нужны все значения в этом измерении. Таким образом, строка X = data[:, 0:5] указывает Numpy, что мы должны взять все строки и столбцы с индексом от 0 до 4 (столбцы с 1 по 5).

Указав -1 в любом измерении, мы просим Numpy вернуть последние значения для этого измерения (т. е. последнюю строку или последний столбец).

Как видно из приведенного выше вывода, наша матрица признаков X теперь имеет форму (3,5), но наши метки были преобразованы в вектор-строку формы (3,).

Если бы мы сделали что-то подобное, как показано ниже, мы могли бы убедиться, что наши метки были представлены в виде двумерной матрицы с одним вектором-столбцом формы (3,1).

>>> y = data[:, -1].reshape(-1, 1)
>>> y
array([[6]
       [4]
       [8]])

Когда мы предоставляем функции изменения формы -1 в качестве первого измерения, мы указываем Numpy, что значение этого измерения неизвестно, и его следует вывести из остальных данных и других предоставленных измерений.

В этом случае мы указали, что y должен содержать один столбец, и, поскольку мы начали с одного вектора-строки, Numpy автоматически создаст для нас двумерный массив с одним вектором-столбцом.

Заворачивать

Numpy — чрезвычайно мощная библиотека, которая станет бесценным инструментом для любого разработчика машинного обучения.

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

В конечном счете, единственный способ, чтобы это стало второй натурой, — это потратить некоторое время на чтение официальной документации и написание кода. Надеюсь, было полезно 😀