Решение систем линейных уравнений с использованием матриц и Python

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

Системы линейных уравнений в ML

Стандартную задачу, которую решают методы ML, можно представить в виде:

Мы имеем дело с набором функций, имея «таблицу» со значениями функций и комбинациями целевых значений. У нас есть целевое значение, определенное для подмножества данных, которые мы можем использовать для обучения. После завершения обучения мы можем применить наши выводы, чтобы получить результаты для набора данных с неизвестным целевым значением:

Как мы помним из математики, линейную функцию можно представить в виде:

Это пример для одного измерения и для двух и более измерений:

Теперь, если мы будем рассматривать наши x1, x2 и так далее как наши функции, а f как целевое значение, мы можем переписать наш первоначальный набор обучающих данных в виде линейных уравнений:

И теперь нам в основном нужно только записать это в виде системы линейных уравнений и решить это:

После решения мы получаем конкретные значения a1, a2… (также называемые весами), которые мы будем использовать в нашей линейной функции для поиска неизвестных целевых значений (f) с известными значениями признаков (x). И эта последняя функция с рассчитанными весами называется моделью машинного обучения.

Настоящая живая заметка

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

Инженеры машинного обучения по-прежнему имеют дело с системами линейных уравнений, но на другом уровне. Вместо того, чтобы решать прямую функцию целевого значения уравнений признаков, мы решаем уравнения, которые помогают нам минимизировать так называемую ошибку (расстояние между реальным целевым значением и рассчитанным на основе заданных весов). Например. если мы используем MSE на основе евклидовой нормы:

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

Матричная форма системы линейных уравнений

Так как же матрицы связаны с системами линейных уравнений? Допустим, нам нужно решить следующую систему линейных уравнений:

Теперь построим матрицу весов (те числа перед нашим x1…3) и двух векторов — X и целевых значений Y:

Как известно, матрицы можно перемножать, поэтому записывать в виде матриц (векторов) следующее — это то же самое, что записывать нашу исходную систему линейных уравнений:

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

Поиск решения с использованием обратной матрицы

Линейная алгебра действительно позволяет нам легко найти решение в матричной форме:

Где эта странная w с -1 называется обратной матрицей. Его можно легко найти с помощью Python, а также вектора X после умножения инвертированной матрицы на Y:

Здесь мы нашли w_inv, используя метод np.linalg.inv, и умножили матрицу w_inv на Y (которая является вектором), чтобы получить результирующий вектор X. Этот скрипт дает нам следующее:

[[1.]
 [2.]
 [3.]]

Который является вычисленным вектором X:

Метод исключения Гаусса

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

Другой подход (используемый группой методов) заключается в преобразовании матрицы w к виду, при котором решение уравнений становится тривиальным. Эта форма называется треугольной формой матрицы, а сам метод называется методом исключения Гаусса (потому что мы фактически исключаем некоторые элементы матрицы).

Процесс преобразования, если он выполняется в несколько итераций и допускается следующее:

  • умножить любую строку на любое число (кроме нуля, конечно),
  • добавить любую строку к любой другой строке,
  • поменять местами любые строки.

Еще одна вещь, которую предлагает нам метод Гаусса, — это добавить наш вектор Y к нашей матрице w, чтобы получить так называемую расширенную матрицу:

Теперь давайте повторим, чтобы получить окончательную треугольную форму. Во-первых, давайте поменяем местами первую и последнюю строки:

Теперь давайте вычтем первую строку, умноженную на 4, из третьей строки:

Далее мы добавим первую строку ко второй:

Хорошо, нам нужно сделать еще одну вещь, чтобы получить треугольную форму — получить 0 там, где у нас -6. Для этого нам нужно умножить вторую строку на 6/8 и добавить к третьей строке:

Это окончательная форма нашей матрицы, так как у нас есть нули под ее диагональю (это треугольная форма, которую мы искали). Как мы помним, эта матрица представляет наш вектор w для X и вектор Y с правой стороны, поэтому мы можем написать обновленную систему на основе новой формы матрицы:

Это тривиальная форма системы, которая позволяет нам выполнять итерацию от третьего к первому уравнению, используя каждое решение нижней итерации на верхней итерации:

В Python scipy можно использовать для получения оптимизированной треугольной матрицы:

Обратите внимание, что scipy вернет другую матрицу, чем мы итерировали. Это связано с тем, что scipy выбирает другую строку в качестве первой строки (она принимает элемент с максимальным первым значением). Но все равно решение системы с использованием этой матрицы будет таким же, как у нас. Так что могут быть разные треугольные формы одной матрицы.

Краткое содержание

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