SVD, возможно, является одним из самых популярных подходов к матричной факторизации.
Он представляет любую матрицу A размера (m × n) как произведение трех матриц: UΣVᵀ, где:
- U - ортогональная (m × m) матрица
- Σ - диагональная матрица сингулярных значений (m × n)
- V - (n × n) ортогональная матрица
Мне всегда было легко поверить, что мы можем это сделать, но я был озадачен такими вопросами, как: почему 3 матрицы? почему сингулярные значения? почему такие размеры? зачем вообще нужно разбирать такую матрицу?
Просматривая Интернет, я нашел много статей и видео о том, как рассчитать SVD, но не смог найти ни одной, обеспечивающей хорошее визуальное представление о том, что происходит. Так что здесь я не буду говорить о том, как на самом деле найти эти матрицы (вы все равно не будете делать это вручную, правда), а попытаюсь ответить на вопросы, которые меня озадачили, когда я впервые столкнулся с SVD, визуально. Я постараюсь избегать использования специальных терминов и формул, насколько это возможно.
Но что такое мартикс?
Итак, первое: что такое визуальное представление матрицы? Мы можем думать о матрице как о таблице (массиве), каждая строка которой содержит координаты точки, тогда она представляет собой набор точек по их координатам. Мы можем легко визуализировать это, если на точку не более трех скоординированных.
A = np.array([
[0, 0, 0],
[2, 2, 1],
[1, 0, 2],
[3, 4, 3]])

Хотите прочитать эту историю позже? Сохраните в Журнале.
Таким образом, каждая точка представлена тремя координатами в трехмерном пространстве. И эти координаты, по сути, говорят, сколько нужно пройти вдоль каждой оси от начала координат, чтобы добраться до этой точки.
Теперь давайте воспользуемся набором данных радужной оболочки глаза для наших экспериментов, он имеет 4-мерные данные, но мы можем просто игнорировать один из параметров, чтобы упростить визуализацию.
Давайте использовать эти столбцы в качестве параметров
X_train = df[['petal_length', 'petal_width', 'sepal_width']].values
Теперь мы можем визуализировать эти данные как точки в трехмерном пространстве.

Здесь цвет просто представляет другой класс объектов в наборе данных, и мы можем легко понять, почему визуальное представление так круто - мы сразу видим, что похожие объекты сгруппированы.
Теперь позвольте мне заявить следующее: SVD эффективно находит другой ортонормированный базис в нашем пространстве и представление исходной матрицы в этом пространстве.
Смена основы
Таким образом, мы можем свободно менять основу, и тогда нам потребуются новые координаты, которые укажут нам, сколько нам нужно пройти по этим новым направлениям, которые мы выбираем, чтобы добраться до каждой точки.
Рассмотрим новую основу:
T = np.array([
[1, 0, 1],
[0, 1, 1],
[0, 0, 1],
])
Итак, новый базис имеет 2 вектора из стандартного (а именно i и j), но у него есть вектор (1, 1, 1) вместо стандартного вектора к

Тонкие линии на рисунке показывают, сколько вам нужно пройти по каждой из новых осей от начала координат, чтобы добраться до заданной точки. Обратите внимание, что помимо направлений, базис также определяет размер «стандартного шага по оси», и какая координата говорит нам, сколько этих шагов нам нужно сделать.
Что такое ортонормированный базис?
- В наших терминах это такая основа, когда вы двигаетесь по одной оси, вы не движетесь по другой. В стандартном режиме, если вы двигаетесь вдоль k (например, вверх или вниз), ваше горизонтальное положение не меняется. Однако, исходя из нашего примера, если вы двигаетесь по синему вектору, вы также будете двигаться по горизонтали. Одним из полезных следствий этого свойства является то, что если мы хотим спроецировать точку на плоскость, охватываемую этими осями (одна из тех серых «стен» на изображениях), нам просто нужно установить соответствующие координаты на 0.
- «Стандартный шаг по оси» - один для всех осей.
Хорошо, давайте посмотрим, как это выглядит для нашего набора данных Iris.

Как мы видим, векторы ортогональны (иными словами, перпендикулярны друг другу).
Именно эти векторы дает нам матрица V! В частности, каждый столбец этой матрицы сообщает нам координаты нового вектора в стандартном базисе.
Масштабирование
Матрица Σ имеет ненулевые элементы только на ее диагонали, и все, что она говорит нам, - это то, на сколько нам нужно растянуть точки вдоль каждой оси. Обратите внимание, что по конструкции все элементы положительны, поэтому он всегда растягивается, а не сжимается. Кроме того, диагональные элементы отсортированы в порядке убывания, что означает, что мы будем перемещать данные по нашей первой оси больше всего, а с каждой следующей осью будет растягиваться все меньше и меньше. Это означает, что исходные данные в основном распределяются по первой из наших новых осей.

Здесь мы можем сравнить, как данные распределяются по нашей 1-й и 3-ей осям.
Новые координаты
Теперь, когда у нас есть новая основа и масштабирование, нам нужно найти, как по-новому выразить наши данные. Нам нужно знать, сколько шагов нам нужно сделать по новым осям, чтобы добраться до всех наших точек. Об этом нам сообщает матрица U. По сути, он содержит новые координаты для всех наших точек.
Посмотрим, как наши данные выглядят в новом мире.

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

Не будет большой разницы, пока мы не обратим внимание на масштабы осей: очевидно, что x имеет самый большой диапазон, затем идет y, а z почти нетронутые масштабированием.
Это то, что мы получаем с помощью (ΣUᵀ) ᵀ. Помните, что линейная алгебра рассматривает координаты точки как вектор-столбец, и в данных каждая запись обычно представлена строкой, поэтому все они ᵀ.
Восстановление исходной матрицы
Затем, если мы применим обратное преобразование к нашим исходным координатам:
(VΣUᵀ)ᵀ = UΣVᵀ = A
Итак, мы сначала транспонируем U, чтобы столбцы представляли точки, затем применяем все преобразования и затем транспонируем обратно в «нормальный» формат данных. Поскольку Σ является диагональным, Σᵀ = Σ (технически, если он не квадратный, он изменит свою форму, но основная часть, заполненная значениями, останется прежней).
Купить почему?
Иногда нам действительно не нужна вся информация, которая есть в данных.
Помните эту картинку?

Здесь распределение по нашему 3-му базисному вектору почти ничего не дает - все точки почти выровнены. Так почему бы нам просто не выбросить эту информацию? Затем мы получим 2D-изображение тех же данных. На 2D проще смотреть, легче хранить и легче обрабатывать.
Вот:

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

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

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

И при взгляде с этого ракурса узор на 2D-сюжете хорошо различим (хотя я плох как оператор).
Краткое резюме
Таким образом, SVD дает нам другую точку зрения на данные, где данные наиболее распределены по (обычно нескольким) первым осям.
Учитывая формулу A = UΣVᵀ
Столбцы Vᵀ содержат векторы, образующие новую основу (таким образом формируя n × n,, как мы выражаем n векторов в n измерениях).
Строки U содержат наши данные, выраженные в терминах новой основы (на самом деле нам нужно только n столбцов, если m ›n, и, например, numpy. linalg.svd () действительно возвращает U как матрицу m × n, но для выполнения ортогонального оператора ее можно заполнить до m × м).
Элементы на главной диагонали Σ говорят, насколько растянуть U вдоль каждой из новых осей.
Если мы используем только некоторое подмножество новых векторов для представления наших данных, мы эффективно проецируем данные на (гипер-) плоскость, образованную оставшимися векторами (помните это полезное свойство ортогональных базисов?). Это полезный метод для уменьшения размерности и вычислительной сложности, а также для представления многомерных данных (мы с трудом можем рисовать данные 4D, а 10D абсолютно выше нашего воображения, но этот метод может позволить нам визуально выявить некоторые зависимости).
Концептуально, если мы говорим о некоторых записях данных, описываемых набором функций, мы можем думать о SVD как о создании нового набора функций путем комбинирования исходных, которые (надеюсь) лучше описывают данные. Например, вместо того, чтобы говорить о длине и ширине экранов, мы объединяем их и говорим о размере диагонали, и этой единственной функции достаточно.
📝 Сохраните эту историю в Журнале.
👩💻 Просыпайтесь каждое воскресное утро и слышите самые интересные истории недели в области технологий, ожидающие в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .