Добро пожаловать в продолжение серии о линейной алгебре. Если вы еще этого не сделали, было бы полезно охватить все из Части 1 серии, прежде чем продолжить, но если вы уже гений линейной алгебры, тогда продолжайте!

Введение в матрицы

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

Извините, если вы ожидали чего-то более захватывающего, но это оно! Хорошая новость заключается в том, что операции, которые вы можете выполнять с матрицами, делают их невероятно полезными. Создание матрицы в Python очень похоже на то, как мы ранее создавали векторы.

import numpy as np
A = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

Индексирование

Изображение матрицы выше дает представление о том, как мы будем ее индексировать. Для этого мы сначала выбираем соответствующую строку, а затем столбец. Важно отметить, что, как и при любом индексировании Python, оно начинается с 0, а не с 1. Поэтому, чтобы извлечь число 8 из матрицы A, которую мы создали ранее, мы должны выбрать строку 3, столбец 2.

# returns a single value - 8 from matrix A
A[3,2]
# return multiple values - 5 and 6 from matrix A
A[1,1:]

Размер

Удивительной особенностью матриц является их способность масштабироваться до больших размеров. В целях визуализации (и чтобы мой мозг не взорвался, пытаясь понять 4+ измерения) мы будем придерживаться 2-х или 3-х мерных матриц. Наиболее распространенный способ записать размер матрицы в следующем порядке (выборки, строки, столбцы).

Чтобы проверить размер матрицы в Python, вы можете просто вызвать .shape непосредственно в массиве. Например, чтобы получить форму матрицы A, которую мы создали ранее, мы должны запустить:

A.shape

Это вернет, что наша матрица (3, 3). Чтобы привести пример матрицы с несколькими образцами, нам нужно создать новую матрицу B.

B = np.array([[[1,2,3],
             [4,5,6],
             [7,8,9]],
            [[1,2,3],
             [4,5,6],
             [7,8,9]]])
B.shape

Если вы запустите этот код, вы увидите (2, 3, 3). Это можно интерпретировать как наличие двух матриц размера 3 x 3, что имеет смысл, поскольку матрица B была сделана из матрицы 2 x A.

Рейтинг

Ранг матрицы — это количество линейно независимых столбцов в матрице. Лучше всего это пояснить на примере:

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

Начнем с первого столбца, вектора [1 1 1] . Это первый вектор, и перед ним ничего не стоит, поэтому он НЕ является линейной комбинацией любых других векторов. Переходим к следующему вектору [2 1 2] , это линейная комбинация [1 1 1] ? Нет, не важно, на что мы умножим вектор [1 1 1], это никогда не даст вектор [2 1 2]. Переходя к третьему столбцу, мы видим, что [3 3 3] всего в 3 раза больше первого вектора [1 1 1] . Мы столкнулись с нашей первой колонкой, которая является линейной комбинацией другой! И, наконец, повезло, вектор [4 2 4] всего в 2 раза больше вектора 2 [2 1 2] , так что снова это столбец, который является линейной комбинацией другого. Хотя приведенный выше пример чрезвычайно прост, линейная зависимость может быть любой комбинацией предыдущих векторов, будь то умножение их на десятичные дроби или сложение сотен других векторов вместе.

Итак, в приведенном выше примере тяжелая работа выполнена. Ранг — это просто количество столбцов (векторов), которые линейно независимы, то есть они НЕ являются линейной комбинацией векторов перед ними. В нашем случае первый и второй векторы были линейно независимыми, а последние два столбца — нет. Следовательно, ранг матрицы C равен 2.

Чтобы вычислить ранг матрицы в Python, мы снова будем использовать NumPy.

np.linalg.matrix_rank(C)

Некоторым из вас может быть интересно, какое применение это может иметь для науки о данных. Если мы вернемся к нашему примеру с матрицей C, которая имеет ранг 2, нам нужно сохранить только 2 столбца (на практике это больше, так как вам также нужно хранить комбинационную матрицу), потому что оставшиеся два столбца можно воссоздать с помощью что сохранилось. У этого есть основные приложения в больших данных, где информация может быть сжата, сохраняя при этом большую часть информации исходных матриц.

Умножение матриц

Если вы читали Часть 1 этой серии, вы бы заметили, что я упомянул, насколько важными станут скалярные произведения, когда мы углубимся в линейную алгебру. Что ж, вам не пришлось слишком долго ждать, чтобы увидеть больше их приложений. Умножение матриц — одно из наиболее важных приложений линейной алгебры в науке о данных. Чаще всего умножение матриц применяется между матрицей и вектором, а также между двумя матрицами. Давайте рассмотрим первую ситуацию ниже:

Матричные и векторные точечные произведения

Допустим, у нас есть матрица A и вектор x, как нам сделать их скалярное произведение?

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

np.dot(A,B)

Продукты Matrix Dot

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

Хотя поначалу это может показаться очень запутанным, по сути, это просто скалярное произведение между столбцами матрицы A и строками матрицы B.

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

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

np.dot(A,B)

Дальнейшие операции с матрицами

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

Инверсия

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

В этом случае матрица A переводит вектор x в вектор b. Но что бы мы делали, если бы не знали вектора x, но имели вектор b? Что мы могли бы сделать, чтобы обратить процесс вспять и увидеть, каким был входной вектор? Вот где начинается инверсия матрицы! Мы можем инвертировать матрицу A (примечание: не все матрицы обратимы) и выполнить скалярное произведение на выходе b, и он вернет исходный входной вектор x.

Чтобы выполнить вышеуказанную операцию в NumPy, мы должны сделать следующее:

np.dot(np.linalg.inv(A), b)

Внимательные из вас, возможно, заметили, что сценарий Ax = b очень похож на то, как мы могли бы обобщить модель линейной регрессии. Где A — матрица входных данных, x — матрица коэффициентов, а b — наш выходной вектор, который мы пытаемся предсказать. Во время обучения у нас есть матрица входных данных A и вектор выходных меток b, но мы ничего не знаем о векторе коэффициентов x. Вот где инверсия играет главную роль!

Транспонировать

Как мы признали ранее, для скалярного произведения двух матриц во второй матрице должно быть столько же строк, сколько столбцов в первой матрице. Часто в науке о данных это не так, поэтому транспонирование позволяет нам вращать матрицу, чтобы мы могли выполнить это условие и продолжить. Мы можем думать о транспонировании как о переворачивании матрицы по ее диагонали. См. пример ниже:

Чтобы транспонировать матрицу в NumPy, мы можем напрямую вызвать метод T для массива.

A.T 

Законы матричных операций

Важно отметить, что, как и в любой области математики, важен порядок операций. Это также относится к линейной алгебре, в частности к матричным операциям. Есть три основных закона, и два из них справедливы для матричных операций.

  1. Коммутативный закон AB = BA нарушается для матричных операций.
  2. Дистрибутивный закон A(B+C) = AB + AC выполняется для матричных операций
  3. Ассоциативный закон A(BC) = (AB)C также выполняется для матричных операций.

Заключение

Надеюсь, вы узнали кое-что о матрицах и их важных приложениях в науке о данных. В следующих статьях станет ясно значение всего, что было рассмотрено в Части 1 и Части 2 этой серии, поскольку это будет лежать в основе всех более сложных приложений линейной алгебры в науке о данных, так что следите за обновлениями!