Векторы и матрицы как структура данных
Почти любая таблица данных внутри аналитических библиотек существует в виде матрицы, и понимание этой формы избавляет от догадок при чтении документации и сообщений об ошибках.
Суть
Вектор — это упорядоченный набор чисел. Слово «упорядоченный» здесь ключевое: числа стоят на закреплённых местах, и место означает смысл. Если вы договорились, что первое число — количество отправлений за месяц, второе — средний вес посылки в килограммах, третье — доля срочных доставок, четвёртое — выручка в тысячах рублей, то набор (120, 3.0, 0.40, 180) полностью описывает одного клиента курьерской компании. Переставлять числа местами нельзя: получится другой клиент или бессмыслица.
Матрица — это набор векторов одинаковой длины, сложенных в прямоугольник. Строка матрицы — один объект (клиент, заказ, курьер, день). Столбец — один признак, измеренный у всех объектов сразу. Когда вы читаете «матрица признаков размера 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).
| Клиент | Отправлений | Средний вес, кг | Доля срочных | Выручка, тыс. руб. |
|---|---|---|---|---|
| A | 120 | 3.0 | 0.40 | 180 |
| B | 118 | 12.0 | 0.05 | 175 |
| C | 60 | 3.2 | 0.42 | 95 |
| D | 240 | 6.0 | 0.20 | 350 |
Вектор клиента 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 — по столбцам; в агрегации указанная ось исчезает из результата.
- Имена признаков и идентификаторы объектов в матрице не хранятся — держите их рядом в том же порядке.
Операции над матрицами и согласование размерностей
Одно правило согласования размерностей объясняет большую часть ошибок вида «shapes not aligned» и позволяет читать код с матричными выражениями, не разбирая его построчно.
Суть
Операций над матрицами в повседневной аналитике встречается немного, и делятся они на две группы. Поэлементные операции — сложение, вычитание, умножение на число, деление — применяются к каждой ячейке отдельно и требуют, чтобы формы совпадали. Если вы вычитаете из матрицы клиентов матрицу той же формы, из каждой ячейки вычтется соответствующая ячейка, и результат сохранит форму (5000 × 4).
Матричное умножение устроено иначе, и это единственная операция, которую стоит разобрать внимательно. Она берёт строку из первой матрицы и столбец из второй, перемножает их поэлементно и складывает результаты в одно число. Чтобы это было выполнимо, длина строки должна совпадать с длиной столбца. Отсюда правило согласования размерностей.
Внутренние числа обязаны совпасть, и они же исчезают из результата; внешние остаются. Матрица клиентов (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.0 | 35.0 |
| C | (60, 3.2, 0.42, 95) | 58.5 | 18.0 |
| D | (240, 6.0, 0.20, 350) | 173.0 | 74.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); внутренние размерности совпадают и исчезают, внешние остаются.
- Матричное умножение (
@) и поэлементное (*) — разные операции; для квадратных матриц обе выполнимы, и ошибка не всплывёт сама. - Предсказание линейной модели — это умножение матрицы признаков на вектор коэффициентов, больше в нём ничего нет.
- Вещание удобно для центрирования, но молчаливо: проверяйте форму результата, а не только отсутствие ошибки.
Скалярное произведение и косинусная близость
Косинусная близость — стандартный способ измерить похожесть двух объектов по их профилю, и она стоит за рекомендациями, look-alike сегментами и поиском по смыслу.
Суть
Скалярное произведение двух векторов одинаковой длины — это сумма попарных произведений их координат. Берём первое число первого вектора, умножаем на первое число второго, затем второе на второе, и так далее, всё складываем. Результат — одно число, а не вектор.
У этого числа есть геометрический смысл: оно велико, когда векторы направлены в одну сторону, близко к нулю, когда они перпендикулярны, и отрицательно, когда направлены противоположно. Но величина зависит ещё и от длины векторов: клиент, у которого все показатели вдвое больше, даст вдвое большее скалярное произведение с кем угодно. Чтобы избавиться от влияния масштаба и оставить только направление, скалярное произведение делят на длины обоих векторов.
Это и есть косинусная близость — косинус угла между векторами. Она измеряет совпадение профиля, а не размера: два клиента с одинаковой структурой отправлений получат близость около единицы независимо от того, отличаются их объёмы в два раза или в двадцать.
Как это считается
Опишем клиентов профилем отправлений по трём категориям груза: документы, посылки, паллеты. Клиент 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 и C | 98 | 7 и 14 | 1.000 |
| A и D | 20 | 7 и 3 | 0.952 |
| A и B | 33 | 7 и 7 | 0.673 |
Клиент D в шесть раз меньше A по объёму, но его структура груза почти та же, и в look-alike сегмент он попадает вторым после C. Клиент B сопоставим с A по объёму, однако возит преимущественно документы, и по профилю он самый далёкий из трёх.
Косинус, посчитанный по признакам в разных единицах измерения. Если в векторе клиента соседствуют выручка в рублях (сотни тысяч), число отправлений (сотни) и доля срочных (от 0 до 1), то вклад доли срочных в скалярное произведение исчезающе мал по сравнению с выручкой. Косинус фактически превращается в сравнение одной выручки, а остальные признаки перестают влиять на результат. Заметить это можно по распределению значений: если все попарные близости в базе лежат в узком коридоре от 0.99 до 1.0, признаки не сопоставимы по масштабу, и один из них подавил остальные. Проверка занимает минуту — постройте гистограмму косинусов; здоровое распределение растянуто, а не собрано в точку у единицы. Лечится приведением признаков к сопоставимому масштабу до расчёта близости.
- Скалярное произведение — сумма попарных произведений координат, результат одно число.
- Косинус равен скалярному произведению, делённому на произведение длин; он измеряет совпадение профиля и не зависит от масштаба.
- Диапазон от −1 до 1, а для неотрицательных признаков от 0 до 1; значения сравнивают между собой, а не с абсолютным порогом.
- Косинус отвечает на вопрос «похожая ли структура», расстояние — на вопрос «похожие ли величины»; выбирайте под задачу.
Нормы, расстояния и зачем нормировать признаки
Любая кластеризация, любой поиск ближайших соседей и любое сравнение клиентов опираются на расстояние, а расстояние без нормировки признаков измеряет не то, что вы думаете.
Суть
Норма вектора — это его длина. Стандартный вариант, евклидова норма (её называют также L2), считается по теореме Пифагора, обобщённой на любое число измерений: возводим каждую координату в квадрат, складываем, извлекаем корень.
Расстояние между двумя объектами — это норма их разности. Сначала вычитаем один вектор из другого покоординатно, потом измеряем длину получившегося вектора. Отсюда евклидово расстояние: корень из суммы квадратов разностей по каждому признаку.
Есть и другие нормы. Манхэттенская (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, то есть отклоняется от типичного клиента почти на три стандартных отклонения.
Минимаксная нормировка удобна, когда границы признака известны и осмысленны, но чувствительна к выбросам: один клиент-гигант растянет шкалу так, что все остальные окажутся сжаты у нуля. Стандартизация устойчивее и применяется по умолчанию в большинстве методов, опирающихся на расстояние.
Пять клиентов, четыре признака. Ищем, кто ближе всего к клиенту A (120 отправлений, 3.0 кг, 0.40 срочных, 180 тыс. руб.).
| Клиент | Отправлений | Средний вес, кг | Доля срочных | Выручка, тыс. руб. |
|---|---|---|---|---|
| A | 120 | 3.0 | 0.40 | 180 |
| B | 118 | 12.0 | 0.05 | 175 |
| C | 60 | 3.2 | 0.42 | 95 |
| D | 240 | 6.0 | 0.20 | 350 |
| E | 40 | 2.5 | 0.60 | 60 |
Без нормировки. Разность 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 складывает модули.
- В сумме квадратов доминирует признак с самыми крупными числами, поэтому расстояние без нормировки измеряет один-два признака вместо всех.
- Стандартизация (вычесть среднее, поделить на стандартное отклонение) — вариант по умолчанию; минимакс удобнее при известных границах, но чувствителен к выбросам.
- Параметры нормировки фиксируются на обучающей выборке и переиспользуются, а не пересчитываются на каждой новой порции данных.
Проекции и интуиция за PCA
Метод главных компонент выглядит загадочно в документации, хотя целиком строится на одной операции — проекции вектора на направление, то есть на его тени.
Суть
Проекция — это тень вектора на выбранное направление. Представьте точку клиента в пространстве признаков и прямую, проходящую через начало координат. Опустите из точки перпендикуляр на эту прямую: место, куда он упал, и есть проекция. Вместо нескольких координат клиент описывается одним числом — положением тени вдоль прямой.
Если направление задано вектором единичной длины u, то величина проекции равна скалярному произведению.
Исходный вектор при этом распадается на две части: то, что улеглось вдоль направления (объяснённая часть), и то, что осталось перпендикулярно (остаток, потерянная при сжатии информация). Между ними работает теорема Пифагора.
Отсюда следует главная идея: чем больше 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 процента.
| Компонента | Дисперсия | Доля | Накопленная доля |
|---|---|---|---|
| 1 | 2.6 | 65.0% | 65.0% |
| 2 | 0.9 | 22.5% | 87.5% |
| 3 | 0.4 | 10.0% | 97.5% |
| 4 | 0.1 | 2.5% | 100.0% |
Первая компонента с крупными положительными нагрузками на отправления и выручку читается как «масштаб клиента». Вторая, где велики нагрузки на долю срочных и отрицательна нагрузка на средний вес, читается как «срочные лёгкие грузы против тяжёлых плановых». Две компоненты позволяют нарисовать всю базу на одной плоскости и увидеть скопления клиентов, которые в четырёх колонках таблицы не различимы глазом.
PCA запущен на нестандартизованных данных. Выручка измеряется сотнями тысяч, доля срочных — сотыми долями, и дисперсия выручки превосходит дисперсию доли срочных на много порядков. Метод ищет направление максимального разброса и находит его там, где числа крупнее: первая компонента почти совпадает с осью выручки. Признак ошибки виден сразу в двух местах. Первое: доля объяснённой дисперсии первой компоненты подозрительно близка к единице, например 0.998, а на все остальные приходятся доли процента. Второе: в нагрузках первой компоненты один признак имеет вес около 1.0, а остальные — около нуля. Если вы это видите, компонента не обобщила данные, а переименовала один столбец. Лечение: пропустить данные через стандартизацию перед PCA, то есть привести каждый признак к нулевому среднему и единичному разбросу.
- Проекция — тень вектора на направление; при единичном направляющем векторе её величина равна скалярному произведению.
- Квадрат длины вектора распадается на объяснённую часть и квадрат остатка, поэтому «больше дисперсии вдоль оси» означает «меньше потерь».
- Главные компоненты — направления максимального разброса, взаимно перпендикулярные; накопленная доля дисперсии показывает, сколько информации осталось.
- PCA создаёт новые смешанные признаки, а не отбирает старые, и требует предварительной стандартизации, иначе первая компонента повторит самый крупный по масштабу столбец.
Теория без задач не держится
Восемь задач по этому модулю: выбор ответа и расчёт, с разбором каждого решения. Задачи, в которых вы ошиблись, вернутся в следующий заход.
Перейти к тренажёру