Математика для аналитика
Модуль 6 · Векторы, расстояния, PCA

Линейная алгебра

Короткий модуль. Цель — не считать матрицы руками, а перестать спотыкаться о слова «вектор», «размерность» и «косинусная близость».

Прочитано
— из 5
6.1

Векторы и матрицы как структура данных

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

Суть

Вектор — это упорядоченный набор чисел. Слово «упорядоченный» здесь ключевое: числа стоят на закреплённых местах, и место означает смысл. Если вы договорились, что первое число — количество заказов за квартал, второе — средний чек в рублях, третье — доля возвратов, четвёртое — число категорий, в которых покупатель что-то заказывал, то набор (24, 1200, 0.10, 5) полностью описывает одного покупателя маркетплейса. Переставлять числа местами нельзя: получится другой покупатель или бессмыслица.

Матрица — это набор векторов одинаковой длины, сложенных в прямоугольник. Строка матрицы — один объект (покупатель, заказ, продавец, товар, день). Столбец — один признак, измеренный у всех объектов сразу. Когда вы читаете «матрица признаков размера 5000 на 4», это означает: пять тысяч покупателей, у каждого четыре измеренных характеристики.

X = (5000 × 4) → 5000 строк-клиентов, 4 столбца-признака

Никакой мистики за словами «вектор» и «матрица» нет. Это та же таблица, которую вы привыкли видеть в отчёте, только с двумя дополнительными договорённостями: все ячейки содержат числа одного типа, и у столбцов нет имён — есть только номера позиций. Витрина «пользователь × категория», собранная из истории заказов, где на пересечении строки и столбца стоит число покупок, — это и есть матрица; допустим, в ней десятки миллионов строк-пользователей и несколько тысяч столбцов-категорий. Отчёт из хранилища и матрица признаков отличаются оформлением, а не сутью.

Размерность и форма

Слово «размерность» в текстах про данные употребляется в двух смыслах, и их стоит различать сразу. Размерность вектора — сколько в нём чисел, то есть сколько признаков описывает объект. Покупатель с четырьмя признаками — это вектор размерности четыре, он живёт в четырёхмерном пространстве признаков. Форма массива (в коде — атрибут shape) — это пара чисел, описывающая прямоугольник целиком: сколько строк и сколько столбцов.

Отсюда типичная фраза из документации: «функция принимает массив формы (n_samples, n_features)». Читается она так: строки — наблюдения, столбцы — признаки, именно в этом порядке. Подавляющее большинство библиотек машинного обучения придерживается этого соглашения, и когда что-то не работает, первая проверка — не перевёрнута ли таблица.

Размерностей может быть больше двух. Тензор формы (12, 5000, 4) — это двенадцать месяцев, для каждого из которых есть матрица покупателей и признаков. Логика та же: каждая ось имеет смысл, и смысл этот задаёте вы, а не библиотека.

Как это считается

Обращение к элементам построено на номерах осей. Ось 0 идёт вдоль строк (сверху вниз), ось 1 — вдоль столбцов (слева направо). В numpy запись X[0] вернёт вектор первого покупателя длины 4, а X[:, 2] — столбец «доля возвратов» длины 5000. Двоеточие означает «все элементы по этой оси».

Агрегации тоже привязаны к оси, и здесь возникает большинство недоразумений. Выражение X.mean(axis=0) усредняет вдоль строк, то есть проходит сверху вниз по каждому столбцу, и даёт четыре числа — средние значения признаков по всей базе покупателей. Выражение X.mean(axis=1) усредняет вдоль столбцов и даёт пять тысяч чисел — по одному на покупателя. Второе почти всегда лишено смысла: складывать рубли со штуками и долями и делить на четыре некорректно. Полезное правило: axis указывает, какая ось исчезает в результате.

Чем матрица отличается от таблицы в отчёте

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

Отсюда рабочая привычка: рядом с матрицей всегда хранить список имён признаков в том же порядке и список идентификаторов объектов в том же порядке. Это обходится в две строки кода и снимает целый класс ошибок.

Пример

Витрина заказов по четырём покупателям за квартал. Каждая строка — вектор, вся таблица — матрица формы (4 × 4).

ПокупательЗаказовСредний чек, руб.Доля возвратовКатегорий в заказах
A2412000.105
B1236000.053
C409000.258
D823000.204

Вектор покупателя A — это (24, 1200, 0.10, 5). Столбец «Доля возвратов» — это вектор (0.10, 0.05, 0.25, 0.20) длины 4. Среднее по оси 0 даёт четыре числа: 21 заказ, 2000 руб., 0.15 и 5 категорий. Среднее по оси 1 дало бы четыре числа вида (307.275, 903.7625, 237.0625, 578.05), в которых смешаны штуки, рубли и доли, — считать их можно, интерпретировать нельзя.

Частая ошибка

Перепутанная ось в агрегации. Аналитик пишет X.mean(axis=1) вместо axis=0, чтобы получить средние по признакам, и код отрабатывает без единого предупреждения. Заметить подмену помогает проверка длины результата: средних по признакам должно быть ровно столько, сколько столбцов (в нашем случае 4), а получилось столько, сколько покупателей (5000). Второй признак ошибки — неправдоподобные значения: среднее, оказавшееся между средним чеком и числом заказов, говорит о том, что сложены величины разной природы. Возьмите за правило после каждой агрегации выводить result.shape и сверять с ожиданием.

Запомнить
  • Вектор — упорядоченный набор чисел про один объект; позиция числа несёт смысл, порядок менять нельзя.
  • Матрица признаков строится по соглашению «строки — объекты, столбцы — признаки», форма записывается как (число объектов × число признаков).
  • Ось 0 идёт по строкам, ось 1 — по столбцам; в агрегации указанная ось исчезает из результата.
  • Имена признаков и идентификаторы объектов в матрице не хранятся — держите их рядом в том же порядке.
6.2

Операции над матрицами и согласование размерностей

Одно правило согласования размерностей объясняет большую часть ошибок вида «shapes not aligned» и позволяет читать код с матричными выражениями, не разбирая его построчно.

Суть

Операций над матрицами в повседневной аналитике встречается немного, и делятся они на две группы. Поэлементные операции — сложение, вычитание, умножение на число, деление — применяются к каждой ячейке отдельно и требуют, чтобы формы совпадали. Если вы вычитаете из матрицы покупателей матрицу той же формы, из каждой ячейки вычтется соответствующая ячейка, и результат сохранит форму (5000 × 4).

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

(n × k) × (k × m) = (n × m)

Внутренние числа обязаны совпасть, и они же исчезают из результата; внешние остаются. Матрица покупателей (5000 × 4), умноженная на матрицу весов (4 × 2), даёт (5000 × 2) — по два числа на каждого покупателя. Умножить те же матрицы в обратном порядке нельзя: 2 и 5000 не совпадают. Матричное умножение некоммутативно, порядок сомножителей — часть смысла выражения.

Как это считается

Возьмём трёх покупателей с четырьмя признаками и вектор весов w = (2, 0.01, −10, 1), который переводит признаки в баллы ценности. Для покупателя A с вектором (24, 1200, 0.10, 5) считаем: 24 × 2 = 48, затем 1200 × 0.01 = 12, затем 0.10 × (−10) = −1, затем 5 × 1 = 5. Сумма равна 64. Для покупателя C с вектором (40, 900, 0.25, 8): 80 + 9 − 2.5 + 8 = 94.5. Для покупателя D с вектором (8, 2300, 0.20, 4): 16 + 23 − 2 + 4 = 41.

Три покупателя, каждый свернулся в одно число. В терминах форм: (3 × 4) умножить на (4 × 1) даёт (3 × 1). Ровно так работает линейная модель — предсказание есть матричное умножение матрицы признаков на вектор коэффициентов, и ничего сверх этого в нём нет. Если весов два набора, они складываются в матрицу (4 × 2), и на выходе получается два столбца оценок вместо одного.

Транспонирование и вещание

Транспонирование меняет строки и столбцы местами: матрица (5000 × 4) превращается в (4 × 5000). В коде это X.T. Операция дешёвая и часто встречается именно как способ подогнать формы под правило согласования, поэтому в выражениях вроде X.T @ X она не несёт отдельного бизнес-смысла — это техническая деталь вычисления.

Вещание (broadcasting) — механизм, который позволяет складывать массивы разной формы, автоматически повторяя недостающее измерение. Вычитание вектора средних длины 4 из матрицы (5000 × 4) работает без явного цикла: вектор мысленно копируется на все пять тысяч строк, и из каждого покупателя вычитается среднее по его признаку. Это удобно и составляет основу центрирования данных. Опасность в том, что вещание молчаливо: оно не сообщает об ошибке, если формы формально совместимы, но смысл потерян.

Где это встречается в коде

Практически везде, где есть модель. Оператор @ в Python означает матричное умножение, np.dot(X, w) делает то же самое. Умножение матрицы на матрицу лежит внутри линейной регрессии, расчёта попарных похожестей товаров по совместным покупкам, преобразования признаков в компоненты. Поэлементное умножение обозначается звёздочкой * и означает совсем другое: A * B перемножит ячейку с ячейкой, а не строку со столбцом. Перепутать эти два оператора — распространённая ошибка, и она особенно коварна для квадратных матриц, где обе операции выполнимы и обе возвращают результат правильной формы.

Пример

Матрица признаков трёх покупателей умножается на матрицу весов (4 × 2): первый столбец весов w₁ = (2, 0.01, −10, 1) даёт балл ценности, второй w₂ = (0, 0.005, 40, 1) — ожидаемую склонность к возвратам.

ПокупательПризнакиЦенностьСклонность к возвратам
A(24, 1200, 0.10, 5)64.015.0
C(40, 900, 0.25, 8)94.522.5
D(8, 2300, 0.20, 4)41.023.5

Проверка склонности к возвратам для покупателя D: 8 × 0 = 0, затем 2300 × 0.005 = 11.5, затем 0.20 × 40 = 8, затем 4 × 1 = 4. Итого 23.5. Формы сошлись: (3 × 4) на (4 × 2) дало (3 × 2) — три покупателя, две оценки.

Частая ошибка

Вычитание вектора-столбца из вектора-строки. Аналитик хочет центрировать средний чек и пишет X[:, 1] - means, где X[:, 1] имеет форму (5000,), а means по недосмотру получил форму (1, 5000) вместо одного числа. Вещание считает такие формы совместимыми и строит матрицу 5000 × 5000 — двадцать пять миллионов чисел вместо пяти тысяч. Ошибки не будет, будет резкий рост потребления памяти и бессмысленный результат дальше по конвейеру. Заметить помогает та же дисциплина: печатать .shape до и после операции. Если после вычитания вектора из вектора у вас появилась матрица, формы разъехались. Родственный случай — сообщение shapes (5000,4) and (2,4) not aligned: внутренние размерности 4 и 2 не совпали, значит второй сомножитель нужно транспонировать либо поменять сомножители местами.

Запомнить
  • Правило согласования: (n × k) на (k × m) даёт (n × m); внутренние размерности совпадают и исчезают, внешние остаются.
  • Матричное умножение (@) и поэлементное (*) — разные операции; для квадратных матриц обе выполнимы, и ошибка не всплывёт сама.
  • Предсказание линейной модели — это умножение матрицы признаков на вектор коэффициентов, больше в нём ничего нет.
  • Вещание удобно для центрирования, но молчаливо: проверяйте форму результата, а не только отсутствие ошибки.
6.3

Скалярное произведение и косинусная близость

Косинусная близость — стандартный способ измерить похожесть двух объектов по их профилю, и она стоит за рекомендациями, look-alike сегментами и поиском по смыслу.

Суть

Скалярное произведение двух векторов одинаковой длины — это сумма попарных произведений их координат. Берём первое число первого вектора, умножаем на первое число второго, затем второе на второе, и так далее, всё складываем. Результат — одно число, а не вектор.

a · b = a₁b₁ + a₂b₂ + … + aₙbₙ

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

cos(a, b) = (a · b) / (‖a‖ × ‖b‖)

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

Как это считается

Опишем покупателей строкой матрицы «пользователь × категория» с тремя категориями: электроника, одежда, товары для дома. Покупатель A заказал за квартал (2, 3, 6) товаров, покупатель B — (6, 3, 2).

Скалярное произведение: 2 × 6 = 12, затем 3 × 3 = 9, затем 6 × 2 = 12. Сумма равна 33. Длина вектора A равна корню из 4 + 9 + 36 = 49, то есть 7. Длина вектора B равна корню из 36 + 9 + 4 = 49, тоже 7. Косинус равен 33 / (7 × 7) = 33 / 49 ≈ 0.673, что соответствует углу около 47.7 градуса.

Теперь покупатель C с профилем (4, 6, 12) — ровно вдвое больший объём заказов при той же структуре. Скалярное произведение с A: 8 + 18 + 72 = 98. Длина C равна корню из 16 + 36 + 144 = 196, то есть 14. Косинус равен 98 / (7 × 14) = 98 / 98 = 1. Единица означает полное совпадение направления: A и C — один и тот же профиль в разном масштабе.

Как читать значение

Косинус принимает значения от −1 до 1. Единица — векторы сонаправлены, профили идентичны. Ноль — векторы перпендикулярны, общего в профилях нет. Минус единица — противоположные направления. На практике признаки часто неотрицательны (количества, доли, суммы), и тогда косинус не опускается ниже нуля, а весь рабочий диапазон лежит между 0 и 1.

Важно, что косинус — величина относительная, и абсолютное значение мало о чём говорит без сравнения. Близость 0.673 не «плохая» сама по себе; она означает лишь, что нашлись пары с близостью 0.95, и на их фоне эта пара дальше. Работая с look-alike сегментами, вы почти всегда сортируете кандидатов по косинусу и берёте верхние N, а не отсекаете по фиксированному порогу.

Косинус или расстояние

Косинусная близость игнорирует масштаб, евклидово расстояние — нет. Выбор зависит от вопроса. Если вы ищете покупателей с похожим составом интересов независимо от того, сколько они заказывают, чтобы показать им одну и ту же подборку, косинус уместен. Если вам важно найти покупателей сопоставимого объёма заказов, чтобы сравнить экономику работы с ними, косинус скроет ровно то различие, которое вас интересует, и нужно расстояние.

Иллюстрация на тех же числах: расстояние между A (2, 3, 6) и C (4, 6, 12) равно корню из 4 + 9 + 36 = 49, то есть 7, а между A и B — корню из 16 + 0 + 16 = 32, около 5.66. По расстоянию A ближе к B, по косинусу A совпадает с C. Обе меры верны, они отвечают на разные вопросы.

Пример

Look-alike сегмент: для покупателя A с профилем (2, 3, 6) ищем самого похожего среди B, C и D. Покупатель D имеет профиль (1, 2, 2), его длина равна корню из 1 + 4 + 4 = 9, то есть 3. Скалярное произведение A и D: 2 + 6 + 12 = 20. Косинус равен 20 / (7 × 3) = 20 / 21 ≈ 0.952.

ПараСкалярное произведениеДлиныКосинус
A и C987 и 141.000
A и D207 и 30.952
A и B337 и 70.673

Покупатель D заказал более чем вдвое меньше A по общему числу товаров (5 против 11), но структура его корзины почти та же, и в look-alike сегмент он попадает вторым после C. Покупатель B сопоставим с A по объёму, однако берёт преимущественно электронику, и по профилю он самый далёкий из трёх. В настоящей витрине категорий не три, а несколько тысяч. Похожесть товаров по совместным покупкам считается тем же способом: сравниваются не строки-пользователи, а столбцы матрицы «пользователь × товар».

Частая ошибка

Косинус, посчитанный по признакам в разных единицах измерения. Если в векторе покупателя соседствуют сумма покупок в рублях (десятки тысяч), число заказов (десятки) и доля возвратов (от 0 до 1), то вклад доли возвратов в скалярное произведение исчезающе мал по сравнению с суммой покупок. Косинус фактически превращается в сравнение одних только рублей, а остальные признаки перестают влиять на результат. Заметить это можно по распределению значений: если все попарные близости в базе лежат в узком коридоре от 0.99 до 1.0, признаки не сопоставимы по масштабу, и один из них подавил остальные. Проверка занимает минуту — постройте гистограмму косинусов; здоровое распределение растянуто, а не собрано в точку у единицы. Лечится приведением признаков к сопоставимому масштабу до расчёта близости.

Запомнить
  • Скалярное произведение — сумма попарных произведений координат, результат одно число.
  • Косинус равен скалярному произведению, делённому на произведение длин; он измеряет совпадение профиля и не зависит от масштаба.
  • Диапазон от −1 до 1, а для неотрицательных признаков от 0 до 1; значения сравнивают между собой, а не с абсолютным порогом.
  • Косинус отвечает на вопрос «похожая ли структура», расстояние — на вопрос «похожие ли величины»; выбирайте под задачу.
6.4

Нормы, расстояния и зачем нормировать признаки

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

Суть

Норма вектора — это его длина. Стандартный вариант, евклидова норма (её называют также L2), считается по теореме Пифагора, обобщённой на любое число измерений: возводим каждую координату в квадрат, складываем, извлекаем корень.

‖v‖ = √(v₁² + v₂² + … + vₙ²)

Расстояние между двумя объектами — это норма их разности. Сначала вычитаем один вектор из другого покоординатно, потом измеряем длину получившегося вектора. Отсюда евклидово расстояние: корень из суммы квадратов разностей по каждому признаку.

d(a, b) = ‖a − b‖ = √((a₁−b₁)² + … + (aₙ−bₙ)²)

Есть и другие нормы. Манхэттенская (L1) складывает модули координат без возведения в квадрат, что делает её устойчивее к отдельным крупным отклонениям. Норма L2 сильнее наказывает одно большое расхождение, чем несколько мелких, и это её содержательное свойство, а не техническая деталь.

Как это считается

Покупатель A имеет профиль заказов по категориям (2, 3, 6), покупатель D — (1, 2, 2). Разность равна (1, 1, 4). Евклидово расстояние: корень из 1 + 1 + 16 = 18, что примерно 4.243. Манхэттенское расстояние: 1 + 1 + 4 = 6. Обе величины описывают одну и ту же пару, но по-разному взвешивают вклад третьей координаты, где расхождение наибольшее.

В коде это np.linalg.norm(a - b) для евклидовой нормы и тот же вызов с параметром ord=1 для манхэттенской. Возводить в квадрат и извлекать корень вручную не нужно; понимать, что именно складывается под корнем, нужно.

Почему масштаб признаков решает всё

Под корнем складываются квадраты разностей по всем признакам сразу. В карточке продавца соседствуют число товаров в каталоге (штуки, сотни и тысячи), срок на площадке (дни, сотни), средний рейтинг (баллы, от 1 до 5) и доля возвратов (сотые доли). Разность по числу товаров измеряется сотнями, разность по доле возвратов — сотыми. После возведения в квадрат первая величина становится больше второй в миллионы раз. Признак с крупными числами полностью определяет расстояние, а признаки с мелкими числами не влияют на результат вообще, независимо от их деловой важности.

Способы нормировки

Лечится это приведением признаков к сопоставимому масштабу. Два ходовых способа. Минимаксная нормировка сжимает каждый признак в отрезок от 0 до 1 по формуле «значение минус минимум, делённое на размах». Стандартизация (z-оценка) вычитает среднее и делит на стандартное отклонение, после чего признак имеет среднее 0 и разброс порядка единицы. Например, при средней доле возвратов 0.12 и стандартном отклонении 0.05 продавец с долей возвратов 0.26 получает z = (0.26 − 0.12) / 0.05 = 2.8, то есть отклоняется от типичного продавца почти на три стандартных отклонения.

z = (x − среднее) / стандартное отклонение

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

Пример

Пять продавцов, четыре признака. Ищем, кто ближе всего к продавцу A (400 товаров, доля возвратов 0.05, рейтинг 4.8, на площадке 900 дней).

ПродавецТоваров в каталогеДоля возвратовСредний рейтингДней на площадке
A4000.054.8900
B3900.304.1880
C1500.064.7300
D9000.154.41500
E1200.084.9200

Без нормировки. Разность A и B равна (10, −0.25, 0.7, 20), сумма квадратов 100 + 0.0625 + 0.49 + 400 = 500.5525, расстояние около 22.37. Разность A и C равна (250, −0.01, 0.1, 600), сумма квадратов 62500 + 0.0001 + 0.01 + 360000 ≈ 422500, расстояние около 650. Вывод по сырым данным: ближайший к A — продавец B.

После минимаксной нормировки (размахи: 780 товаров, 0.25 доли возвратов, 0.8 балла рейтинга, 1300 дней) продавец A получает координаты (0.359, 0.000, 0.875, 0.538), продавец B — (0.346, 1.000, 0.000, 0.523), продавец C — (0.038, 0.040, 0.750, 0.077). Расстояние от A до C становится около 0.58, от A до B — около 1.33, от A до D — около 1.02, от A до E — около 0.67. Вывод переворачивается: ближайший к A — продавец C.

Так и должно быть по смыслу. C работает так же аккуратно, как A: возвраты редки, рейтинг высокий, только каталог меньше и на площадке он не так давно. B сопоставим с A по размеру каталога и стажу, но у него возвращают почти каждый третий заказ и рейтинг заметно ниже — это продавец другого качества. Сырое расстояние видело только штуки и дни и поставило B на первое место.

Частая ошибка

Параметры нормировки пересчитываются заново на каждой новой выборке. Аналитик обучил сегментацию продавцов на данных за первое полугодие, посчитав минимумы и максимумы по этой выборке, а через месяц применил ту же модель к свежим данным, снова вызвав нормировщик с нуля. Минимум и максимум числа товаров в новой выборке другие, значит один и тот же продавец с каталогом на 400 товаров получил в июне координату 0.359, а в июле, скажем, 0.312 — и переехал в соседний сегмент, хотя ничего в его работе не изменилось. Признак ошибки: доля продавцов, сменивших сегмент между расчётами, аномально высока (десятки процентов) при стабильных исходных показателях. Правило: параметры нормировки (минимумы, максимумы, средние, стандартные отклонения) считаются один раз на обучающей выборке, сохраняются вместе с моделью и применяются к новым данным без пересчёта.

Запомнить
  • Норма — длина вектора, расстояние — норма разности двух векторов; L2 берёт корень из суммы квадратов, L1 складывает модули.
  • В сумме квадратов доминирует признак с самыми крупными числами, поэтому расстояние без нормировки измеряет один-два признака вместо всех.
  • Стандартизация (вычесть среднее, поделить на стандартное отклонение) — вариант по умолчанию; минимакс удобнее при известных границах, но чувствителен к выбросам.
  • Параметры нормировки фиксируются на обучающей выборке и переиспользуются, а не пересчитываются на каждой новой порции данных.
6.5

Проекции и интуиция за PCA

Метод главных компонент выглядит загадочно в документации, хотя целиком строится на одной операции — проекции вектора на направление, то есть на его тени.

Суть

Проекция — это тень вектора на выбранное направление. Представьте точку продавца в пространстве признаков и прямую, проходящую через начало координат. Опустите из точки перпендикуляр на эту прямую: место, куда он упал, и есть проекция. Вместо нескольких координат продавец описывается одним числом — положением тени вдоль прямой.

Если направление задано вектором единичной длины u, то величина проекции равна скалярному произведению.

t = x · u, при условии ‖u‖ = 1

Исходный вектор при этом распадается на две части: то, что улеглось вдоль направления (объяснённая часть), и то, что осталось перпендикулярно (остаток, потерянная при сжатии информация). Между ними работает теорема Пифагора.

‖x‖² = t² + ‖остаток‖²

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

Как это считается

Возьмём двумерный случай: признаки «число товаров в каталоге» и «число заказов за месяц», обе величины стандартизованы. Направление u = (0.6, 0.8) единичное, поскольку 0.36 + 0.64 = 1. Продавец x = (3, 5).

Величина проекции: 3 × 0.6 = 1.8, затем 5 × 0.8 = 4.0, сумма t = 5.8. Сама точка-тень: 5.8 × (0.6, 0.8) = (3.48, 4.64). Остаток: (3 − 3.48, 5 − 4.64) = (−0.48, 0.36), его длина равна корню из 0.2304 + 0.1296 = 0.36, то есть 0.6.

Проверим по теореме Пифагора: ‖x‖² = 9 + 25 = 34, а t² = 33.64, разность 0.36 — ровно квадрат длины остатка. Из двух координат мы оставили одно число 5.8 и потеряли лишь 0.36 из 34, то есть около одного процента. Для второго продавца y = (1, 2): t = 0.6 + 1.6 = 2.2, остаток (−0.32, 0.24) длиной 0.4, потеряно 0.16 из 5. Направление подобрано так, что оба продавца ложатся на прямую почти без потерь, — это и означает, что признаки сильно связаны между собой: у кого шире каталог, у того и заказов больше.

От проекции к главным компонентам

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

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

Каждой компоненте соответствует доля объяснённой дисперсии — сколько разброса данных она забирает на себя. Для четырёх стандартизованных признаков суммарная дисперсия равна 4. Если компоненты забирают 2.6, 0.9, 0.4 и 0.1, то доли составят 65, 22.5, 10 и 2.5 процента, а первые две вместе объяснят 87.5 процента. Это и есть основание сказать: четыре признака заменяем двумя числами, теряя примерно восьмую часть информации.

Что PCA не делает

Метод не отбирает признаки. Он не оставляет две колонки из четырёх, а создаёт две новые, каждая из которых — взвешенная смесь всех исходных. Компонента с нагрузками (0.55, 0.12, −0.48, 0.67) не называется никак и не имеет готовой интерпретации; аналитик смотрит на нагрузки и придумывает название сам, например «крупные давно работающие продавцы», если самые большие веса пришлись на размер каталога и срок на площадке.

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

Пример

База продавцов описана четырьмя признаками: число товаров в каталоге, доля возвратов, средний рейтинг и срок на площадке. Размер каталога и срок работы сильно связаны — кто дольше на площадке, тот успел завести больше карточек. PCA на стандартизованных данных даёт в нашем примере доли объяснённой дисперсии 65, 22.5, 10 и 2.5 процента.

КомпонентаДисперсияДоляНакопленная доля
12.665.0%65.0%
20.922.5%87.5%
30.410.0%97.5%
40.12.5%100.0%

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

Частая ошибка

PCA запущен на нестандартизованных данных. Число товаров в каталоге измеряется тысячами, доля возвратов — сотыми долями, и дисперсия первого признака превосходит дисперсию второго на много порядков. Метод ищет направление максимального разброса и находит его там, где числа крупнее: первая компонента почти совпадает с осью «число товаров». Признак ошибки виден сразу в двух местах. Первое: доля объяснённой дисперсии первой компоненты подозрительно близка к единице, например 0.998, а на все остальные приходятся доли процента. Второе: в нагрузках первой компоненты один признак имеет вес около 1.0, а остальные — около нуля. Если вы это видите, компонента не обобщила данные, а переименовала один столбец. Лечение: пропустить данные через стандартизацию перед PCA, то есть привести каждый признак к нулевому среднему и единичному разбросу.

Запомнить
  • Проекция — тень вектора на направление; при единичном направляющем векторе её величина равна скалярному произведению.
  • Квадрат длины вектора распадается на объяснённую часть и квадрат остатка, поэтому «больше дисперсии вдоль оси» означает «меньше потерь».
  • Главные компоненты — направления максимального разброса, взаимно перпендикулярные; накопленная доля дисперсии показывает, сколько информации осталось.
  • PCA создаёт новые смешанные признаки, а не отбирает старые, и требует предварительной стандартизации, иначе первая компонента повторит самый крупный по масштабу столбец.
Закрепление

Теория без задач не держится

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

Перейти к тренажёру