Обратная матрица 🔄
Для чисел деление устроено просто: $6 / 2 = 3$, потому что $2 \cdot 3 = 6$. У каждого ненулевого числа $a$ есть обратное $a^{-1} = 1/a$, такое что $a \cdot a^{-1} = 1$. Единственное исключение — ноль: на него делить нельзя, потому что не существует числа $x$, для которого $0 \cdot x = 1$.
С матрицами формального «деления» не существует вовсе — нет такой операции $A / B$. Но математики нашли обходной путь: если для матрицы $A$ найдётся такая матрица, что их произведение даёт единичную матрицу, эту матрицу называют обратной и обозначают $A^{-1}$. Умножение на $A^{-1}$ играет роль деления. И, как и в случае с нулём, не у каждой матрицы есть обратная — существуют матрицы, для которых $A^{-1}$ принципиально не существует, сколько ни старайся.
В прошлом уроке ты разобрался с минорами и алгебраическими дополнениями — на первый взгляд, чисто техническим инструментом для разложения определителя. Сейчас эти инструменты соберутся в готовый механизм: с их помощью ты научишься строить обратную матрицу вручную, а заодно поймёшь второй, куда более практичный способ — метод Гаусса.
Если ты метишь в data science или ML, у этой темы есть прямое практическое применение, которое ты обязательно встретишь: формула нормальных уравнений линейной регрессии $w = (X^T X)^{-1} X^T y$ — это буквально формула, которая находит коэффициенты регрессии за один шаг, без градиентного спуска. И у неё есть тёмная сторона: если среди признаков есть линейная зависимость (мультиколлинеарность), матрица $X^T X$ перестаёт быть обратимой, и формула ломается — да так, что код может либо упасть с ошибкой, либо тихо выдать бессмысленные коэффициенты. Понимание того, что такое обратимость и откуда берётся вырожденность, — это не абстрактная алгебра, а инструмент отладки реальных ML-пайплайнов.
История: откуда это взялось?
Идею об обратном элементе для матрицы формально ввёл английский математик Артур Кэли в 1858 году в работе «A Memoir on the Theory of Matrices» — именно там матрицы впервые стали самостоятельными объектами со своей алгеброй: сложением, умножением и, в том числе, обращением. До Кэли матрицы существовали лишь как удобная запись коэффициентов системы уравнений; после — как объекты, с которыми можно работать почти как с числами, только с поправкой на то, что умножение не коммутативно и не у всех есть обратный элемент.
Сам же вычислительный метод для нахождения обратной матрицы через последовательные преобразования строк — метод Гаусса — гораздо старше идеи Кэли, хотя и получил формальное имя позже. Приёмы, эквивалентные исключению переменных, встречаются ещё в древнекитайском трактате «Математика в девяти книгах» (около II века до н. э.). В Европе метод систематизировал Карл Фридрих Гаусс на рубеже XVIII–XIX веков — в частности, при вычислении орбиты астероида Церера методом наименьших квадратов, что удивительным образом сближает историю обратной матрицы с историей линейной регрессии. Немецкий геодезист Вильгельм Жордан в 1888 году довёл идею до конца: предложил продолжать исключение переменных не только вниз, но и вверх, получая сразу единичную матрицу и обратную матрицу за один проход — так родился метод Гаусса-Жордана, которым ты будешь пользоваться в этом уроке.
С тех пор обратная матрица прошла путь от инструмента геодезистов до фундамента вычислительной линейной алгебры: на ней держатся статистика (нормальные уравнения регрессии), экономика (модель «затраты — выпуск» Василия Леонтьева, за которую он получил Нобелевскую премию в 1973 году), компьютерная графика (обращение матриц трансформации камеры) и — да — почти любая ML-библиотека, где-то внутри вызывающая numpy.linalg.inv или её более безопасный аналог numpy.linalg.solve.
Определение: что значит «обратная» матрица
Давай разберёмся с формальным определением, прежде чем считать что-либо руками.
Определение: Квадратная матрица $A$ порядка $n$ называется обратимой, если существует такая матрица $A^{-1}$ того же порядка, что
$$A \cdot A^{-1} = A^{-1} \cdot A = E$$где $E$ — единичная матрица порядка $n$. Матрица $A^{-1}$ называется обратной к $A$.
Три важные детали сразу бросаются в глаза.
Во-первых, обратная матрица определена только для квадратных матриц. У прямоугольной матрицы $5 \times 3$ нет и не может быть матрицы $A^{-1}$ в этом строгом смысле — умножение $A \cdot A^{-1}$ и $A^{-1} \cdot A$ дают матрицы разных размеров, и требование $A A^{-1} = A^{-1} A$ автоматически теряет смысл. (Позже, в контексте ML, ты увидишь, что для прямоугольных матриц используется другой инструмент — псевдообратная матрица.)
Во-вторых, определение требует равенства с обеих сторон: и $A A^{-1} = E$, и $A^{-1} A = E$. Это не случайность — для квадратных матриц оказывается, что одно равенство автоматически влечёт другое (это доказывается в общем курсе линейной алгебры через понятие ранга), но на этапе изучения полезно проверять обе стороны, чтобы не приучить себя к ложному чувству уверенности.
В-третьих, если обратная матрица существует, она единственна. Представь, что у матрицы $A$ есть сразу два «кандидата» на роль обратной — матрицы $B$ и $C$, такие что $AB = BA = E$ и $AC = CA = E$. Тогда:
$$B = B \cdot E = B \cdot (AC) = (BA) \cdot C = E \cdot C = C$$Значит, $B = C$ — второй обратной матрицы просто не бывает. Это не просто красивый факт: он гарантирует, что как только ты нашёл хоть какую-то матрицу, удовлетворяющую определению, можно не искать других — это и есть та самая $A^{-1}$.
Представь, что $A^{-1}$ — это «Ctrl+Z» для матрицы $A$. Если $A$ поворачивает вектор на $30°$ по часовой стрелке, то $A^{-1}$ поворачивает его на $30°$ обратно. Если $A$ растягивает пространство в 3 раза по одной оси, $A^{-1}$ сжимает его обратно в 3 раза. Применить сначала $A$, а потом $A^{-1}$ — то же самое, что не применять ничего: именно это и означает равенство $A^{-1} A = E$.
Критерий существования: когда обратной матрицы просто не бывает
А теперь ключевой вопрос: у любой ли квадратной матрицы есть обратная? Нет. И критерий здесь предельно чёткий.
Теорема (критерий обратимости): Квадратная матрица $A$ обратима тогда и только тогда, когда $\det(A) \neq 0$.
Матрицу с $\det(A) \neq 0$ называют невырожденной (или неособенной). Матрицу с $\det(A) = 0$ называют вырожденной (или особенной) — для неё $A^{-1}$ не существует.
Интуиция здесь такая же, как с делением на ноль. Определитель — это, грубо говоря, коэффициент того, во сколько раз матрица «растягивает» объём пространства при линейном преобразовании. Если $\det(A) = 0$, преобразование схлопывает пространство в объект меньшей размерности — например, плоскость сжимается в линию, а трёхмерное пространство сплющивается в плоскость. Информация при этом безвозвратно теряется: множество разных векторов превращается в один и тот же результат. А если несколько разных входов дают один и тот же выход, никакая обратная операция не сможет однозначно «отмотать» преобразование назад — она просто не будет знать, к какому из входов возвращаться.
Разберём это на матрице $B = \begin{pmatrix} 2 & 4 \\ 1 & 2 \end{pmatrix}$. Её определитель:
$$\det(B) = 2 \cdot 2 - 4 \cdot 1 = 4 - 4 = 0$$Строки этой матрицы пропорциональны: вторая строка, умноженная на 2, даёт первую. Геометрически это преобразование сжимает всю плоскость в одну прямую — а значит, у него нет обратного. Проверять инвертируемость всегда нужно до того, как ты начал строить союзную матрицу или гонять метод Гаусса — иначе рискуешь потратить десять минут на вычисления, которые обязаны провалиться.
Почему это важно на практике: в линейной регрессии условие $\det(X^T X) \neq 0$ — это ровно то же самое условие «столбцы матрицы $X$ линейно независимы», то есть среди признаков нет точных (или почти точных) линейных зависимостей. Если у тебя в датасете два признака — «рост в сантиметрах» и «рост в дюймах», — они связаны линейно ($\text{дюймы} = \text{см} / 2{,}54$), и матрица $X^T X$ окажется вырожденной. Формула нормальных уравнений в этом случае буквально ломается — к этому мы ещё вернёмся отдельно.
Формула через союзную матрицу: собираем алгебраические дополнения воедино
Теперь — конструктивный способ найти $A^{-1}$, если она существует. Он напрямую опирается на прошлый урок про алгебраические дополнения.
Представь, что тебе нужно собрать мебель по инструкции: сначала находишь все детали (алгебраические дополнения каждого элемента), затем раскладываешь их в определённом порядке (составляешь матрицу), а потом — неожиданный шаг — переворачиваешь всю конструкцию (транспонируешь), и только после этого всё встаёт на место (делишь на определитель).
Определение: Пусть $A$ — квадратная матрица порядка $n$ с $\det(A) \neq 0$, и $A_{ij}$ — алгебраическое дополнение элемента $a_{ij}$ (напомним: $A_{ij} = (-1)^{i+j} M_{ij}$, где $M_{ij}$ — минор, полученный вычёркиванием $i$-й строки и $j$-го столбца).
Союзная (присоединённая) матрица $\operatorname{adj}(A)$ — это транспонированная матрица алгебраических дополнений:
$$\operatorname{adj}(A) = \begin{pmatrix} A_{11} & A_{21} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \end{pmatrix}$$Тогда обратная матрица находится по формуле:
$$A^{-1} = \frac{1}{\det(A)} \operatorname{adj}(A)$$
Обрати особое внимание на транспонирование: если ты забудешь его сделать и просто разделишь на определитель матрицу алгебраических дополнений без транспонирования — получишь неверный ответ, который к тому же может случайно совпасть с правильным на симметричных матрицах и обмануть тебя. Это одна из самых частых ошибок в этой теме, и ниже мы разберём её отдельно.
Пример 1 (лёгкий): матрица $2 \times 2$
Возьмём $A = \begin{pmatrix} 2 & 5 \\ 1 & 3 \end{pmatrix}$.
Шаг 1. Проверяем определитель:
$$\det(A) = 2 \cdot 3 - 5 \cdot 1 = 6 - 5 = 1 \neq 0$$Матрица невырожденная — обратная существует.
Шаг 2. Находим алгебраические дополнения (для матрицы $2\times2$ миноры — это просто оставшиеся числа):
$$A_{11} = +\,3 = 3, \quad A_{12} = -\,1 = -1, \quad A_{21} = -\,5 = -5, \quad A_{22} = +\,2 = 2$$Шаг 3. Составляем союзную матрицу (транспонируем матрицу дополнений $\begin{pmatrix} 3 & -1 \\ -5 & 2 \end{pmatrix}$):
$$\operatorname{adj}(A) = \begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix}$$Шаг 4. Делим на определитель:
$$A^{-1} = \frac{1}{1}\begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix} = \begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix}$$Проверка: $A \cdot A^{-1} = \begin{pmatrix} 2 & 5 \\ 1 & 3 \end{pmatrix}\begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix} = \begin{pmatrix} 6-5 & -10+10 \\ 3-3 & -5+6 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} = E$ ✅
Кстати, для матриц $2\times2$ этот процесс всегда сворачивается в короткую формулу, которую полезно помнить наизусть: для $A = \begin{pmatrix} a & b \\ c & d \end{pmatrix}$
$$A^{-1} = \frac{1}{ad - bc}\begin{pmatrix} d & -b \\ -c & a \end{pmatrix}$$Это просто «поменять местами диагональ, сменить знак у побочной диагонали, поделить на определитель» — та же самая процедура, что мы проделали через алгебраические дополнения, просто в свёрнутом виде.
Пример 2 (средний): матрица $3 \times 3$
Теперь матрица посерьёзнее: $A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 10 \end{pmatrix}$.
Шаг 1. Определитель (разложение по первой строке):
$$\det(A) = 1(5\cdot10 - 6\cdot8) - 2(4\cdot10 - 6\cdot7) + 3(4\cdot8 - 5\cdot7) = 1\cdot2 - 2\cdot(-2) + 3\cdot(-3) = 2+4-9 = -3$$Определитель $-3 \neq 0$ — обратная существует.
Шаг 2. Все девять алгебраических дополнений:
$$A_{11} = +(50-48)=2, \quad A_{12} = -(40-42)=2, \quad A_{13} = +(32-35)=-3$$$$A_{21} = -(20-24)=4, \quad A_{22} = +(10-21)=-11, \quad A_{23} = -(8-14)=6$$
$$A_{31} = +(12-15)=-3, \quad A_{32} = -(6-12)=6, \quad A_{33} = +(5-8)=-3$$
Шаг 3. Союзная матрица (транспонируем матрицу дополнений):
$$\operatorname{adj}(A) = \begin{pmatrix} 2 & 4 & -3 \\ 2 & -11 & 6 \\ -3 & 6 & -3 \end{pmatrix}$$Шаг 4. Делим на определитель ($-3$):
$$A^{-1} = \frac{1}{-3}\begin{pmatrix} 2 & 4 & -3 \\ 2 & -11 & 6 \\ -3 & 6 & -3 \end{pmatrix} = \begin{pmatrix} -\frac{2}{3} & -\frac{4}{3} & 1 \\ -\frac{2}{3} & \frac{11}{3} & -2 \\ 1 & -2 & 1 \end{pmatrix}$$Проверка (одна строка для примера): первая строка $A$, умноженная на первый столбец $A^{-1}$: $1\cdot(-\frac23) + 2\cdot(-\frac23) + 3\cdot1 = -\frac23-\frac43+3 = -2+3 = 1$ ✅. Первая строка на второй столбец: $1\cdot(-\frac43)+2\cdot\frac{11}{3}+3\cdot(-2) = -\frac43+\frac{22}{3}-6 = 6-6=0$ ✅. Остальные шесть произведений проверяются точно так же и дают $E$.
Эту же матрицу мы ещё раз найдём методом Гаусса чуть ниже — и получим в точности тот же ответ, что хорошо иллюстрирует: методы разные, а обратная матрица — одна.
Пример 3 (на проверку критерия): матрица без обратной
А теперь важный контрпример: попробуем найти обратную для $A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 1 & 1 & 1 \end{pmatrix}$.
Шаг 1. Проверяем определитель, прежде чем считать что-либо ещё:
$$\det(A) = 1(4\cdot1-6\cdot1) - 2(2\cdot1-6\cdot1) + 3(2\cdot1-4\cdot1) = 1(-2) - 2(-4) + 3(-2) = -2+8-6 = 0$$Определитель равен нулю. Дальше считать нечего — обратной матрицы у $A$ не существует. Действительно, вторая строка здесь — это первая строка, умноженная на 2: строки линейно зависимы, матрица вырождена.
Это ровно та ситуация, которая в ML называется точной мультиколлинеарностью: если бы строки этой матрицы были не строками произвольной матрицы, а столбцами матрицы признаков $X$ (то есть два признака были бы связаны как $x_2 = 2x_1$), формула $(X^TX)^{-1}$ отказала бы точно так же, как только что отказала эта.
Почему это важно: проверка $\det(A) \neq 0$ — это не формальность «для порядка», а первый и обязательный шаг любого вычисления обратной матрицы. Пропустив его, легко потратить время на вычисление союзной матрицы для матрицы, у которой обратной попросту нет.
Метод Гаусса: практичная альтернатива
Формула через союзную матрицу изящна, но у неё есть серьёзный недостаток: чтобы найти обратную матрицу $n \times n$ через алгебраические дополнения, нужно вычислить $n^2$ определителей размера $(n-1)\times(n-1)$, а каждый из них раскладывается дальше. Вычислительная сложность растёт как $O(n!)$ — уже для матрицы $10\times10$ это триллионы операций. Компьютерам такой подход не подходит совершенно.
Метод Гаусса-Жордана устроен иначе и гораздо экономичнее — сложность $O(n^3)$. Идея: записываем рядом матрицу $A$ и единичную матрицу $E$ в виде расширенной матрицы $(A \mid E)$, а затем элементарными преобразованиями строк (перестановка строк, умножение строки на число, прибавление одной строки к другой) приводим левую часть к единичной матрице. Правая часть при этом сама превращается в $A^{-1}$:
$$(A \mid E) \quad \xrightarrow{\text{преобразования строк}} \quad (E \mid A^{-1})$$Давай проверим это на той же матрице $3\times3$, что мы уже обратили через союзную матрицу — так проще всего убедиться, что оба метода дают одинаковый результат.
Пример: метод Гаусса для той же матрицы
$A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 10 \end{pmatrix}$. Записываем расширенную матрицу:
$$\left(\begin{array}{ccc|ccc} 1 & 2 & 3 & 1 & 0 & 0 \\ 4 & 5 & 6 & 0 & 1 & 0 \\ 7 & 8 & 10 & 0 & 0 & 1 \end{array}\right)$$Шаг 1. Обнуляем первый столбец под ведущей единицей: $R_2 \to R_2 - 4R_1$, $R_3 \to R_3 - 7R_1$:
$$\left(\begin{array}{ccc|ccc} 1 & 2 & 3 & 1 & 0 & 0 \\ 0 & -3 & -6 & -4 & 1 & 0 \\ 0 & -6 & -11 & -7 & 0 & 1 \end{array}\right)$$Шаг 2. Обнуляем второй столбец под ведущим элементом: $R_3 \to R_3 - 2R_2$:
$$\left(\begin{array}{ccc|ccc} 1 & 2 & 3 & 1 & 0 & 0 \\ 0 & -3 & -6 & -4 & 1 & 0 \\ 0 & 0 & 1 & 1 & -2 & 1 \end{array}\right)$$Шаг 3. Идём наверх: обнуляем третий столбец над ведущим элементом $R_3$: $R_2 \to R_2 + 6R_3$, $R_1 \to R_1 - 3R_3$:
$$\left(\begin{array}{ccc|ccc} 1 & 2 & 0 & -2 & 6 & -3 \\ 0 & -3 & 0 & 2 & -11 & 6 \\ 0 & 0 & 1 & 1 & -2 & 1 \end{array}\right)$$Шаг 4. Нормируем вторую строку ($R_2 \to R_2 / (-3)$) и обнуляем второй столбец над ней: $R_1 \to R_1 - 2R_2$:
$$\left(\begin{array}{ccc|ccc} 1 & 0 & 0 & -\frac23 & -\frac43 & 1 \\ 0 & 1 & 0 & -\frac23 & \frac{11}{3} & -2 \\ 0 & 0 & 1 & 1 & -2 & 1 \end{array}\right)$$Левая часть стала единичной матрицей — значит, правая часть и есть $A^{-1}$:
$$A^{-1} = \begin{pmatrix} -\frac23 & -\frac43 & 1 \\ -\frac23 & \frac{11}{3} & -2 \\ 1 & -2 & 1 \end{pmatrix}$$Это в точности та же матрица, что мы получили через союзную матрицу и алгебраические дополнения. Совпадение не случайно: обратная матрица — единственный объект, и не важно, каким путём ты до него добрался.
Почему это важно: именно метод Гаусса (точнее, его родственник — LU-разложение) лежит в основе того, как numpy.linalg.inv и аналогичные функции в реальности вычисляют обратную матрицу. Ни одна серьёзная численная библиотека не считает алгебраические дополнения — это математически красиво, но вычислительно расточительно. А ещё, забегая вперёд: даже метод Гаусса для нахождения явной обратной матрицы не самый эффективный способ, если тебе нужно всего лишь решить систему $Ax=b$ — об этом будет отдельный лайфхак в конце урока.
Матричные уравнения: AX = B и XA = B
Одно из главных применений обратной матрицы — решение уравнений, где неизвестное само является матрицей.
Рассмотрим уравнение $AX = B$, где $A$ и $B$ известны, а $X$ нужно найти. Если $A$ обратима, домножим обе части слева на $A^{-1}$:
$$A^{-1}(AX) = A^{-1}B \implies (A^{-1}A)X = A^{-1}B \implies EX = A^{-1}B \implies X = A^{-1}B$$Обрати внимание: домножали именно слева, потому что матричное умножение некоммутативно — $A^{-1}B$ и $BA^{-1}$ в общем случае разные матрицы. Если бы уравнение выглядело как $XA = B$, домножать нужно было бы справа:
$$X(AA^{-1}) = BA^{-1} \implies X = BA^{-1}$$Порядок множителей здесь принципиален, и это одна из ловушек темы — вернёмся к ней в разделе про частые ошибки.
Пример: решаем AX = B
Пусть $A = \begin{pmatrix} 2 & 5 \\ 1 & 3 \end{pmatrix}$ (мы уже знаем $A^{-1} = \begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix}$) и $B = \begin{pmatrix} 4 & 2 \\ 1 & 3 \end{pmatrix}$.
$$X = A^{-1}B = \begin{pmatrix} 3 & -5 \\ -1 & 2 \end{pmatrix}\begin{pmatrix} 4 & 2 \\ 1 & 3 \end{pmatrix} = \begin{pmatrix} 12-5 & 6-15 \\ -4+2 & -2+6 \end{pmatrix} = \begin{pmatrix} 7 & -9 \\ -2 & 4 \end{pmatrix}$$Проверка: $AX = \begin{pmatrix} 2 & 5 \\ 1 & 3 \end{pmatrix}\begin{pmatrix} 7 & -9 \\ -2 & 4 \end{pmatrix} = \begin{pmatrix} 14-10 & -18+20 \\ 7-6 & -9+12 \end{pmatrix} = \begin{pmatrix} 4 & 2 \\ 1 & 3 \end{pmatrix} = B$ ✅
Такие уравнения возникают, например, когда нужно найти сразу несколько решений линейных систем с одной и той же матрицей коэффициентов $A$, но разными правыми частями — тогда столбцы $B$ можно объединить в одну матрицу и решить всё одним матричным уравнением, а не по отдельности.
Обратная матрица в машинном обучении: нормальные уравнения и мультиколлинеарность
Давай разберёмся, где всё это оживает в реальной задаче. Линейная регрессия ищет веса $w$, минимизирующие сумму квадратов ошибок $\|Xw - y\|^2$, где $X$ — матрица признаков (со столбцом единиц для свободного члена), а $y$ — вектор целевых значений. Минимизация этой функции (через приравнивание градиента к нулю) даёт знаменитые нормальные уравнения:
$$X^TX \, w = X^Ty \quad \implies \quad w = (X^TX)^{-1} X^Ty$$Это одна из самых цитируемых формул в статистике и ML — и она целиком опирается на существование $(X^TX)^{-1}$.
Пример: считаем регрессию руками
Возьмём три точки: $x=1,\, y=3$; $x=2,\, y=5$; $x=3,\, y=6$. Матрица признаков со столбцом единиц (для свободного члена) и вектор целей:
$$X = \begin{pmatrix} 1 & 1 \\ 1 & 2 \\ 1 & 3 \end{pmatrix}, \qquad y = \begin{pmatrix} 3 \\ 5 \\ 6 \end{pmatrix}$$Шаг 1. Считаем $X^TX$:
$$X^TX = \begin{pmatrix} 1&1&1 \\ 1&2&3 \end{pmatrix}\begin{pmatrix} 1 & 1 \\ 1 & 2 \\ 1 & 3 \end{pmatrix} = \begin{pmatrix} 3 & 6 \\ 6 & 14 \end{pmatrix}$$Шаг 2. Проверяем обратимость: $\det(X^TX) = 3\cdot14 - 6\cdot6 = 42-36 = 6 \neq 0$ — обратима.
Шаг 3. Находим обратную (формула для $2\times2$):
$$(X^TX)^{-1} = \frac{1}{6}\begin{pmatrix} 14 & -6 \\ -6 & 3 \end{pmatrix} = \begin{pmatrix} \frac73 & -1 \\ -1 & \frac12 \end{pmatrix}$$Шаг 4. Считаем $X^Ty$:
$$X^Ty = \begin{pmatrix} 3+5+6 \\ 1\cdot3+2\cdot5+3\cdot6 \end{pmatrix} = \begin{pmatrix} 14 \\ 31 \end{pmatrix}$$Шаг 5. Находим веса:
$$w = (X^TX)^{-1}X^Ty = \begin{pmatrix} \frac73 & -1 \\ -1 & \frac12 \end{pmatrix}\begin{pmatrix} 14 \\ 31 \end{pmatrix} = \begin{pmatrix} \frac{98}{3}-31 \\ -14+\frac{31}{2} \end{pmatrix} = \begin{pmatrix} \frac53 \\ \frac32 \end{pmatrix} \approx \begin{pmatrix} 1{,}667 \\ 1{,}5 \end{pmatrix}$$Получаем прямую $y \approx 1{,}667 + 1{,}5x$. Проверим: при $x=1$ прогноз $3{,}167$ (факт $3$), при $x=2$ — $4{,}667$ (факт $5$), при $x=3$ — $6{,}167$ (факт $6$). Прямая не проходит через точки идеально — и не должна: это метод наименьших квадратов, который ищет наилучшее приближение, а не точную интерполяцию.
Что происходит, когда $X^TX$ вырождена
А теперь ключевой практический момент. Предположим, среди признаков затесались два одинаковых по смыслу — скажем, "площадь квартиры в м²" и "площадь квартиры в м², умноженная на 1" (или просто дублирующийся столбец). Тогда столбцы $X$ становятся линейно зависимыми, и — это важное свойство, которое стоит просто запомнить — если столбцы $X$ линейно зависимы, то и столбцы $X^TX$ линейно зависимы тоже, а значит $\det(X^TX) = 0$.
Формула $w = (X^TX)^{-1}X^Ty$ в этот момент просто не работает: обратной матрицы не существует. На практике это проявляется по-разному: numpy.linalg.inv может выбросить исключение LinAlgError: Singular matrix, а может (если матрица не идеально вырождена, а лишь близка к вырожденной из-за сильной, но не точной корреляции признаков) — вернуть матрицу с огромными, нестабильными значениями, из-за ошибок округления при делении на число, близкое к нулю.
Стандартных решения два. Первое — регуляризация (Ridge-регрессия): к $X^TX$ прибавляют $\lambda E$ с небольшим $\lambda > 0$:
$$w = (X^TX + \lambda E)^{-1} X^Ty$$Прибавление $\lambda E$ на диагональ гарантированно делает матрицу обратимой (можно показать, что все собственные значения $X^TX + \lambda E$ строго положительны при $\lambda > 0$, даже если у $X^TX$ было нулевое собственное значение). Второе решение — псевдообратная матрица Мура-Пенроуза $X^+$ (через сингулярное разложение, SVD), которая существует всегда, даже для вырожденных и прямоугольных матриц, и даёт решение с наименьшей нормой среди всех возможных.
Почему это важно: на собеседовании по data science тебя вполне могут спросить, почему модель линейной регрессии выдаёт неадекватно огромные коэффициенты при коррелированных признаках. Теперь ты знаешь точный математический ответ: матрица $X^TX$ близка к вырожденной, её определитель близок к нулю, и деление на этот почти-ноль в формуле обратной матрицы взрывает численные значения.
Практика: 30 заданий
Базовые (задания 1–10)
Задание 1: Найди обратную матрицу для $A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}$.
Задание 2: Проверь, обратима ли матрица $B = \begin{pmatrix} 2 & 4 \\ 1 & 2 \end{pmatrix}$.
Задание 3: Найди обратную матрицу для $C = \begin{pmatrix} 5 & 3 \\ 3 & 2 \end{pmatrix}$.
Задание 4: Чему равна обратная матрица к единичной матрице $E = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}$?
Задание 5: Найди обратную для матрицы перестановки $F = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}$.
Задание 6: Найди обратную для диагональной матрицы $G = \begin{pmatrix} 2 & 0 \\ 0 & 3 \end{pmatrix}$.
Задание 7: Проверь обратимость $H = \begin{pmatrix} 4 & 6 \\ 2 & 3 \end{pmatrix}$.
Задание 8: Найди обратную для $K = \begin{pmatrix} 3 & 5 \\ 1 & 2 \end{pmatrix}$.
Задание 9: Найди обратную для $L = \begin{pmatrix} 7 & 2 \\ 3 & 1 \end{pmatrix}$.
Задание 10: Найди обратную для нижнетреугольной матрицы $M = \begin{pmatrix} 2 & 0 \\ 5 & 3 \end{pmatrix}$.
Средние (задания 11–20)
Задание 11: Найди обратную матрицу к $N = \begin{pmatrix} 1 & 0 & 2 \\ 0 & 1 & 1 \\ 1 & 1 & 0 \end{pmatrix}$ методом союзной матрицы.
Задание 12: Найди обратную для верхнетреугольной $P = \begin{pmatrix} 1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1 \end{pmatrix}$.
Задание 13: Проверь обратимость $R = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix}$.
Задание 14: Реши матричное уравнение $AX=B$, где $A = \begin{pmatrix} 2 & 5 \\ 1 & 3 \end{pmatrix}$, $B = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}$.
Задание 15: Реши уравнение $XA = B$, где $A = \begin{pmatrix} 1 & 2 \\ 0 & 1 \end{pmatrix}$, $B = \begin{pmatrix} 3 & 4 \\ 1 & 2 \end{pmatrix}$.
Задание 16: Найди обратную для $S = \begin{pmatrix} 2 & 1 & 1 \\ 1 & 3 & 2 \\ 1 & 0 & 0 \end{pmatrix}$ методом Гаусса.
Задание 17: Найди обратную для диагональной матрицы $T = \begin{pmatrix} 2 & 0 & 0 \\ 0 & 5 & 0 \\ 0 & 0 & 10 \end{pmatrix}$.
Задание 18: Не вычисляя обратную матрицу целиком, покажи, что матрица Вандермонда $U = \begin{pmatrix} 1 & 1 & 1 \\ 1 & 2 & 4 \\ 1 & 3 & 9 \end{pmatrix}$ (строки — степени $1, x, x^2$ при $x=1,2,3$) обратима.
Задание 19: Реши уравнение $AX = E$ для $A = \begin{pmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 3 & 4 & 1 \end{pmatrix}$ методом Гаусса.
Задание 20: Есть две точки данных: $(x=0, y=1)$ и $(x=1, y=3)$. Составь $X$, найди $X^TX$ и проверь её обратимость, затем найди веса $w=(w_0, w_1)$ линейной регрессии $y = w_0 + w_1 x$.
Продвинутые (задания 21–30)
Задание 21: Для $A = \begin{pmatrix} 1 & 2 \\ 3 & 7 \end{pmatrix}$ найди $A^{-1}$ и проверь результат прямым умножением.
Задание 22: Реши уравнение $XB=C$, где $B = \begin{pmatrix} 2 & 1 \\ 1 & 1 \end{pmatrix}$, $C = \begin{pmatrix} 3 & 5 \\ 2 & 3 \end{pmatrix}$.
Задание 23: Матрица $X^TX = \begin{pmatrix} 4 & 2 \\ 2 & 1 \end{pmatrix}$ получена из двух признаков, один из которых — точное удвоение другого. Проверь вырожденность и найди Ridge-версию $(X^TX + \lambda E)^{-1}$ при $\lambda=1$.
Задание 24: Объясни (без формул с числами), почему для прямоугольной матрицы $X$ размера $5\times2$ выражение $X^{-1}$ не имеет смысла, и что используют вместо него в ML.
Задание 25: Найди обратную для $V = \begin{pmatrix} 3 & 0 & 2 \\ 2 & 0 & -2 \\ 0 & 1 & 1 \end{pmatrix}$, используя разложение по столбцу с двумя нулями.
Задание 26: Даны 4 точки: $(1,2), (2,3), (3,5), (4,6)$. Найди веса линейной регрессии $y=w_0+w_1x$ через нормальные уравнения.
Задание 27: Докажи, что если $A$ обратима, то $(A^{-1})^{-1}=A$.
Задание 28: Докажи, что для обратимых квадратных матриц $A, B$ одного размера $(AB)^{-1} = B^{-1}A^{-1}$ (а не $A^{-1}B^{-1}$).
Задание 29: В датасете два признака дублируют друг друга — "рост в см" и "рост в дюймах". Объясни, что произойдёт с $\det(X^TX)$, и почему np.linalg.inv(X.T @ X) может выдать предупреждение о вырожденности или вернуть подозрительно огромные числа.
Задание 30: Дана система нормальных уравнений $(X^TX)w = X^Ty$ с $X^TX = \begin{pmatrix} 3 & 6 \\ 6 & 14 \end{pmatrix}$ и $X^Ty = \begin{pmatrix} 14 \\ 31 \end{pmatrix}$ (из примера в тексте урока). Реши систему методом Гаусса, не вычисляя явную обратную матрицу, и сравни результат.
Частые ошибки
❌ Ошибка 1: искать обратную матрицу, не проверив $\det(A) \neq 0$
Самая частая и самая дорогая по времени ошибка. Если начать строить союзную матрицу или гнать метод Гаусса для вырожденной матрицы, метод Гаусса рано или поздно упрётся в строку из одних нулей (без возможности получить единицу на диагонали), а метод через алгебраические дополнения даст формулу с делением на ноль. Правильный порядок действий: всегда сначала считаешь $\det(A)$, и только если он не ноль — переходишь к дальнейшим шагам.
❌ Ошибка 2: забыть транспонировать матрицу алгебраических дополнений
Формула — это $A^{-1} = \frac{1}{\det A}\operatorname{adj}(A)$, где $\operatorname{adj}(A)$ — это транспонированная матрица алгебраических дополнений, а не сама матрица алгебраических дополнений. Пропуск транспонирования — классическая ошибка, которая на симметричных матрицах (где $A=A^T$) случайно даёт правильный ответ и создаёт ложное чувство, что всё в порядке, а на несимметричных — гарантированно ломает результат. Возьми за правило: посчитал все $A_{ij}$ → обязательно переставь строки со столбцами → только потом дели на определитель.
❌ Ошибка 3: ошибка знака в алгебраическом дополнении (шахматный узор)
Знак $A_{ij} = (-1)^{i+j}M_{ij}$ чередуется по "шахматному" принципу: $+,-,+,-,\ldots$. Легко на автомате поставить везде плюс или перепутать чётность индекса, особенно для элементов вроде $A_{23}$ или $A_{32}$, где сумма индексов кажется "неочевидной". Полезная привычка — прежде чем считать миноры, сразу выписать себе шахматную сетку знаков для матрицы нужного размера.
❌ Ошибка 4: перепутать порядок в матричном уравнении
Из $AX=B$ следует $X=A^{-1}B$, а из $XA=B$ — $X=BA^{-1}$. Это не взаимозаменяемые формулы! Матричное умножение некоммутативно, и $A^{-1}B \neq BA^{-1}$ в общем случае. Прежде чем домножать на $A^{-1}$, всегда явно определи, с какой стороны стоит неизвестное $X$ относительно $A$ в исходном уравнении, и домножай именно с этой же стороны.
❌ Ошибка 5: путать обратную матрицу с транспонированной или с союзной
$A^T$, $\operatorname{adj}(A)$ и $A^{-1}$ — три разных объекта, связанных одной формулой ($A^{-1} = \operatorname{adj}(A)/\det A$), но не взаимозаменяемых. В общем случае $A^{-1} \neq A^T$ (равенство выполняется только для специального класса ортогональных матриц) и $A^{-1} \neq \operatorname{adj}(A)$ (равенство выполняется только когда $\det A = 1$).
❌ Ошибка 6: применять формулу нормальных уравнений вслепую, не проверив мультиколлинеарность
В ML-коде легко написать np.linalg.inv(X.T @ X) @ X.T @ y, не задумываясь о том, обратима ли $X^TX$. Если среди признаков есть точная или почти точная линейная зависимость, результат либо упадёт с ошибкой, либо (что хуже) тихо вернёт огромные нестабильные коэффициенты, которые выглядят как "рабочая" модель, но на самом деле бессмысленны. Перед обращением стоит либо проверить обусловленность матрицы, либо сразу использовать регуляризацию.
❌ Ошибка 7: считать, что у прямоугольной матрицы есть обычная обратная
$X^{-1}$ определена только для квадратных матриц. Для прямоугольной матрицы признаков нужна псевдообратная $X^+ = (X^TX)^{-1}X^T$ (или её аналог через $XX^T$ для другой ориентации) — это разные конструкции с разными условиями существования, и путать их — источник как минимум непонимания, а как максимум неправильно написанного кода.
Главное запомнить
✅ Обратная матрица $A^{-1}$ определяется равенством $A \cdot A^{-1} = A^{-1} \cdot A = E$ и существует только для квадратных матриц.
✅ Критерий существования: $A^{-1}$ существует тогда и только тогда, когда $\det(A) \neq 0$ (матрица невырождена). Это первое, что нужно проверить, прежде чем что-либо вычислять.
✅ Если обратная матрица существует, она единственна — искать "второй вариант" не нужно.
✅ Формула через союзную матрицу: $A^{-1} = \frac{1}{\det(A)}\operatorname{adj}(A)$, где $\operatorname{adj}(A)$ — транспонированная матрица алгебраических дополнений. Забыть транспонирование — самая коварная ошибка темы.
✅ Метод Гаусса-Жордана ($(A \mid E) \to (E \mid A^{-1})$) вычислительно эффективнее метода через дополнения ($O(n^3)$ против $O(n!)$) и именно он лежит в основе реальных численных библиотек.
✅ Матричные уравнения решаются домножением на обратную матрицу с правильной стороны: из $AX=B$ следует $X=A^{-1}B$, из $XA=B$ следует $X=BA^{-1}$.
✅ $(A^{-1})^{-1}=A$, и $(AB)^{-1}=B^{-1}A^{-1}$ — порядок множителей при обращении произведения переворачивается, как и при транспонировании.
✅ Формула нормальных уравнений линейной регрессии $w=(X^TX)^{-1}X^Ty$ напрямую использует обратную матрицу — и требует, чтобы $X^TX$ была невырожденной.
✅ Мультиколлинеарность признаков (линейная зависимость столбцов $X$) делает $X^TX$ вырожденной или почти вырожденной — формула ломается либо явно (ошибка), либо незаметно (огромные нестабильные коэффициенты).
✅ Решения проблемы вырожденности в ML: регуляризация ($X^TX+\lambda E$, Ridge) или псевдообратная матрица Мура-Пенроуза (через SVD, numpy.linalg.pinv).
Связь с другими темами курса
Что нужно было знать до этого урока:
-
Определители и их свойства — без понятия $\det(A)$ невозможно сформулировать критерий обратимости
-
Миноры и алгебраические дополнения — прямая техническая база для формулы через союзную матрицу
-
Матричное умножение и его некоммутативность — без этого не понять, почему порядок множителей в $A^{-1}B$ и $BA^{-1}$ имеет значение
Что изучить дальше:
-
Ранг матрицы (следующий урок) — обобщает понятие вырожденности на прямоугольные матрицы и даёт язык для описания "степени" линейной зависимости строк или столбцов, когда обратной матрицы уже нет, но что-то про матрицу всё равно можно сказать
-
Системы линейных уравнений и метод Крамера — ещё один способ решать $Ax=b$ через определители, тесно связанный с обратной матрицей
-
Собственные значения и собственные векторы — обратимость матрицы напрямую связана с тем, есть ли у неё нулевое собственное значение
-
Сингулярное разложение (SVD) и псевдообратная матрица — обобщение идеи обращения на любые, в том числе вырожденные и прямоугольные, матрицы
Где это нужно в жизни:
🤖 В машинном обучении: нормальные уравнения линейной регрессии, регуляризация (Ridge, Lasso в модифицированном виде), обращение ковариационных матриц в анализе главных компонент (PCA) и гауссовских процессах.
💻 В компьютерной графике: обращение матриц трансформации камеры и объектов — чтобы перейти из мировых координат в координаты камеры и обратно.
📊 В экономике: модель "затраты — выпуск" Василия Леонтьева, где обратная матрица $(E-A)^{-1}$ показывает полные (прямые и косвенные) затраты ресурсов на производство.
🔐 В криптографии: некоторые схемы шифрования, работающие через модулярную арифметику матриц (шифр Хилла), опираются на существование обратной матрицы по заданному модулю.
Интересные факты
💡 Кэли ввёл матрицы как алгебру, а не как таблицу чисел. До его работы 1858 года матрица воспринималась просто как удобная запись коэффициентов уравнения. Именно Кэли предложил рассматривать матрицы как объекты, которые можно складывать, умножать и обращать — почти как числа, но с оговоркой на некоммутативность.
💡 "Жордан" из метода Гаусса-Жордана — не тот Жордан, о котором ты, возможно, подумал. Метод назван в честь немецкого геодезиста Вильгельма Жордана (Wilhelm Jordan, 1842–1899), а не в честь известного французского математика Камиля Жордана (Camille Jordan), автора теоремы Жордана о кривой и жордановой нормальной формы. Это одна из самых частых путаниц в истории математики — два современника с похожей фамилией, работавших в смежных областях.
💡 Компьютеры почти никогда не вычисляют обратную матрицу через определители. Метод с алгебраическими дополнениями имеет вычислительную сложность порядка $O(n!)$ и абсолютно непрактичен уже для матриц среднего размера. Реальные библиотеки (LAPACK, а через неё и numpy) используют варианты метода Гаусса — LU-разложение — со сложностью $O(n^3)$.
💡 "Обусловленность" матрицы — количественная мера того, насколько она близка к вырожденной. Число обусловленности (condition number) показывает, во сколько раз может усилиться ошибка вычислений при обращении матрицы. Матрицы с высоким числом обусловленности называют "плохо обусловленными" — именно такими становятся $X^TX$ при сильной, но не идеальной мультиколлинеарности признаков, и именно поэтому ML-инженеры используют регуляризацию даже когда матрица формально ещё не вырождена.
Лайфхаки и полезные трюки
1. Формула-шпаргалка для $2\times2$
Для $A = \begin{pmatrix} a & b \\ c & d \end{pmatrix}$ всегда быстрее держать в голове готовую формулу, чем расписывать алгебраические дополнения:
$$A^{-1} = \frac{1}{ad-bc}\begin{pmatrix} d & -b \\ -c & a \end{pmatrix}$$Меняешь местами элементы главной диагонали, меняешь знак у побочной, делишь всё на определитель.
2. Быстрая проверка результата
После вычисления $A^{-1}$ всегда стоит проверить хотя бы одну строку произведения $A\cdot A^{-1}$ (не обязательно всё целиком) — если получаешь не $[1, 0, \ldots]$, значит где-то ошибка, и лучше найти её сразу, а не после того, как результат "поехал" дальше по решению.
3. Ищи нули перед разложением
Если в матрице есть строка или столбец с нулями (как в задании 25 практики), раскладывай определитель именно по ним — это резко уменьшает число слагаемых и вероятность арифметической ошибки.
4. Треугольные и диагональные матрицы — не строй союзную матрицу зря
Обратная к диагональной матрице — диагональная с обратными числами. Обратная к треугольной матрице — треугольная того же типа (верхняя остаётся верхней, нижняя — нижней). Для таких матриц метод Гаусса почти всегда быстрее и надёжнее, чем возня с алгебраическими дополнениями.
5. В коде: solve, а не явная inv
Если тебе нужно решить $Ax=b$ (в том числе нормальные уравнения регрессии), не строй явную обратную матрицу через numpy.linalg.inv(A) @ b — используй numpy.linalg.solve(A, b). Это не только быстрее, но и численно устойчивее: solve использует более аккуратные вычисления и не требует явного деления на определитель, поэтому меньше страдает от накопления ошибок округления на плохо обусловленных матрицах.
6. При подозрении на мультиколлинеарность — сразу регуляризация
Если в модели много признаков и есть шанс скрытой линейной зависимости между ними, не жди LinAlgError — сразу закладывай Ridge-регуляризацию ($X^TX+\lambda E$) или используй numpy.linalg.pinv вместо numpy.linalg.inv. Это дешёвая страховка от падения пайплайна на новых данных, где корреляция признаков может проявиться сильнее, чем на обучающей выборке.
Обратная матрица — это не просто ещё одна формула для запоминания, а завершающий штрих в истории про определители, миноры и алгебраические дополнения, которую ты собирал последние несколько уроков. Теперь у тебя есть полный набор инструментов: ты умеешь проверять, можно ли вообще "отменить" матрицу, находить это обращение двумя независимыми способами и понимать, что стоит за одной из самых цитируемых формул статистики. В следующем уроке — ранг матрицы — ты увидишь, что происходит с этой историей, когда обратной матрицы нет вовсе, но матрица всё равно хранит в себе полезную структуру.
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку