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

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

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

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

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

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

Суть

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

Матрица — это набор векторов одинаковой длины, сложенных в прямоугольник. Строка матрицы — один объект (клиент, заказ, курьер, день). Столбец — один признак, измеренный у всех объектов сразу. Когда вы читаете «матрица признаков размера 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).

КлиентОтправленийСредний вес, кгДоля срочныхВыручка, тыс. руб.
A1203.00.40180
B11812.00.05175
C603.20.4295
D2406.00.20350

Вектор клиента A — это (120, 3.0, 0.40, 180). Столбец «Доля срочных» — это вектор (0.40, 0.05, 0.42, 0.20) длины 4. Среднее по оси 0 даёт четыре числа: 134.5 отправлений, 6.05 кг, 0.2675 и 200 тыс. руб. Среднее по оси 1 дало бы четыре числа вида (75.85, 76.2625, 39.655, 149.05), в которых смешаны штуки, килограммы, доли и рубли, — считать их можно, интерпретировать нельзя.

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

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

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

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

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

Суть

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

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

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

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

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

Возьмём трёх клиентов с четырьмя признаками и вектор весов w = (0.5, 2, 30, 0.1), который переводит признаки в баллы скоринга. Для клиента A с вектором (120, 3.0, 0.40, 180) считаем: 120 × 0.5 = 60, затем 3.0 × 2 = 6, затем 0.40 × 30 = 12, затем 180 × 0.1 = 18. Сумма равна 96. Для клиента C с вектором (60, 3.2, 0.42, 95): 30 + 6.4 + 12.6 + 9.5 = 58.5. Для клиента D с вектором (240, 6.0, 0.20, 350): 120 + 12 + 6 + 35 = 173.

Три клиента, каждый свернулся в одно число. В терминах форм: (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₁ = (0.5, 2, 30, 0.1) даёт скоринг ценности, второй w₂ = (0, 1, −10, 0.2) — оценку сложности обслуживания.

КлиентПризнакиЦенностьСложность
A(120, 3.0, 0.40, 180)96.035.0
C(60, 3.2, 0.42, 95)58.518.0
D(240, 6.0, 0.20, 350)173.074.0

Проверка сложности для клиента D: 240 × 0 = 0, затем 6.0 × 1 = 6, затем 0.20 × (−10) = −2, затем 350 × 0.2 = 70. Итого 74. Формы сошлись: (3 × 4) на (4 × 2) дало (3 × 2) — три клиента, две оценки.

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

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

Запомнить
  • Правило согласования: (n × k) на (k × m) даёт (n × m); внутренние размерности совпадают и исчезают, внешние остаются.
  • Матричное умножение (@) и поэлементное (*) — разные операции; для квадратных матриц обе выполнимы, и ошибка не всплывёт сама.
  • Предсказание линейной модели — это умножение матрицы признаков на вектор коэффициентов, больше в нём ничего нет.
  • Вещание удобно для центрирования, но молчаливо: проверяйте форму результата, а не только отсутствие ошибки.
5.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 по объёму, но его структура груза почти та же, и в look-alike сегмент он попадает вторым после C. Клиент B сопоставим с A по объёму, однако возит преимущественно документы, и по профилю он самый далёкий из трёх.

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

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

Запомнить
  • Скалярное произведение — сумма попарных произведений координат, результат одно число.
  • Косинус равен скалярному произведению, делённому на произведение длин; он измеряет совпадение профиля и не зависит от масштаба.
  • Диапазон от −1 до 1, а для неотрицательных признаков от 0 до 1; значения сравнивают между собой, а не с абсолютным порогом.
  • Косинус отвечает на вопрос «похожая ли структура», расстояние — на вопрос «похожие ли величины»; выбирайте под задачу.
5.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 для манхэттенской. Возводить в квадрат и извлекать корень вручную не нужно; понимать, что именно складывается под корнем, нужно.

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

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

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

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

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

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

Пример

Пять клиентов, четыре признака. Ищем, кто ближе всего к клиенту A (120 отправлений, 3.0 кг, 0.40 срочных, 180 тыс. руб.).

КлиентОтправленийСредний вес, кгДоля срочныхВыручка, тыс. руб.
A1203.00.40180
B11812.00.05175
C603.20.4295
D2406.00.20350
E402.50.6060

Без нормировки. Разность A и B равна (2, −9.0, 0.35, 5.0), сумма квадратов 4 + 81 + 0.1225 + 25 = 110.1225, расстояние около 10.49. Разность A и C равна (60, −0.2, −0.02, 85), сумма квадратов 3600 + 0.04 + 0.0004 + 7225 = 10825.04, расстояние около 104.04. Вывод по сырым данным: ближайший к A — клиент B.

После минимаксной нормировки (размахи: 200 отправлений, 9.5 кг, 0.55 доли, 290 тыс. руб.) клиент A получает координаты (0.400, 0.053, 0.636, 0.414), клиент B — (0.390, 1.000, 0.000, 0.397), клиент C — (0.100, 0.074, 0.673, 0.121). Расстояние от A до C становится около 0.42, от A до B — около 1.14, от A до D — около 0.97, от A до E — около 0.68. Вывод переворачивается: ближайший к A — клиент C.

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

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

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

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

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

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

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