Привет, читатели! Это продолжение моей средней тенденции - понимание теории / математики машинного обучения. Поскольку я начал заниматься этой темой, я буду писать статьи среднего размера, описывающие свой путь, следите за обновлениями. А теперь вернемся к моей статье!

В предыдущей статье я рассмотрел математику, лежащую в основе одномерной линейной регрессии и ее реализацию в Python. Теперь вы, возможно, смотрите на многомерную линейную регрессию и думаете: Ну, мой мозг вот-вот поджарится. И хотя мы будем опираться на предыдущие концепции, уверяю вас, что эту тему понять гораздо легче, чем вы думаете. Претензия подкреплена моей гарантией возврата денег! (Получить? Эта статья бесплатная 😉)

Прежде чем мы погрузимся в безумие, я быстро ознакомлюсь с некоторыми базовыми знаниями. Введите: Векторы и матрицы! (Если вы здесь только для объяснения, начните с Обновление уравнений)

Массивы

Если вы когда-либо занимались программированием, возможно, вы знакомы с типом данных, известным как массив. По сути, это тип данных, который содержит элементы одного и того же типа, которые свободно доступны с использованием индекса элемента. Вот краткая диаграмма:

Вот что замечательно в массивах - они могут быть вложены друг в друга. Вы можете иметь одномерный, двухмерный, трехмерный, вплоть до n-мерного массива (при условии, что ваш компьютер может обрабатывать такую ​​команду). Опять же, любой элемент в этих n-мерных массивах может быть доступен с правильной серией индексов. Вот первые три:

Векторы и матрицы

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

Весь прямоугольник 4x6 представляет собой одну матрицу, а одна строка (1,2,3,4,5,6) или столбец (1,7,13,19) является вектором. Вот как я это запомнил: массив с «1» в его размерах является вектором, массив с двумя числами в его размерах, которые не равны « 1 ” представляет собой матрицу.

Обозначения векторов и матриц

В массивах у нас есть простой способ обращения к каждому элементу. Но как это работает в векторах / матрицах? Каждое значение, содержащееся в векторе / матрице, называется «записью». Ссылка на запись может быть сделана, используя обозначение: (Имя матрицы) (строка, столбец). Назовем матрицу, которую мы только что видели, A. Чтобы получить доступ к значению «14», мы должны использовать A₃₂.

Матричные операции

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

Чтобы вы могли сложить две матрицы вместе, они должны иметь одинаковые размеры. Обратите внимание, как мы складываем две матрицы размером 2x2. Каждая запись с одинаковой позицией складывается, чтобы сформировать другую матрицу значений. Вычитание работает так же, как и сложение; записи с одинаковой позицией вычитаются. То же самое и с векторами, однако векторы должны иметь одинаковые размеры.

С матрицами мы также можем выполнять операции, называемые скалярным умножением и делением. Все это означает, что мы можем умножать или делить на одно число:

В отличие от сложения и вычитания, мы можем умножать или делить матрицу и вектор. Вот пример:

Прежде чем мы сможем выполнить эту операцию, мы должны сначала увидеть, возможно ли. Правило гласит следующее: количество столбцов в матрице должно равняться количеству записей в векторе. В более математическом определении, в матрице m x n с m строками и n столбцами вектор должен - матрица n x1 с n строками. Если наша матрица и вектор удовлетворяют этим условиям, мы можем продолжить.

Чтобы упростить операцию, вырежьте строку матрицы. Слева направо, первая запись в выбранной строке матрицы будет умножена на первую запись вектора (a * x = ax ). Затем вторая запись в той же строке матрицы будет умножена на вторую запись вектора (b * x = bx). . Этот шаблон продолжается до тех пор, пока все записи в строке матрицы и все записи в векторе не умножатся. Затем все умноженные в одной строке значения складываются (ax + by). Это продолжается до тех пор, пока каждая строка матрицы не пройдет через этот процесс.

А как насчет умножения и деления матриц? Прежде чем мы ответим на этот вопрос, нам нужно посмотреть, возможно ли вообще выполнить эту операцию.

Правило гласит: количество столбцов в первой матрице должно быть равно количеству строк во второй матрице. Более математическое определение было бы в матрице m x n с m строками и n столбцами, которые нам понадобятся умножить его на матрицу n x o. Если эти условия соблюдены, мы можем продолжить.

Чтобы ответить на вопрос о том, как мы собираемся умножать или делить матрицы, мы собираемся применить ту же логику, однако сначала нам придется разделить одну из матриц на отдельные векторы.

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

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



Обновление уравнений

В статье об одномерной линейной регрессии мы использовали уравнение: hᶿ (𝑥) = θ₀ + θ₁𝑥. Это уравнение предполагало, что нас интересует только нахождение взаимосвязи между двумя переменными - но что, если у вас их более 2, 3, 4, 1000000? На самом деле события редко когда-либо зависят от нескольких переменных, чтобы учесть огромное количество данных, к которым у нас есть доступ, нам нужно будет обновить наши уравнения, чтобы они принимали столько параметров, сколько требуется.

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

Каждый x представляет данные для отдельной функции. Как и в случае с одномерной линейной регрессией, мы пытаемся вычислить различные тэты, чтобы точно подогнать линию к разным наборам данных. Значение каждого параметра определяет, насколько конкретная функция влияет на результат. Позвольте мне привести конкретный пример того, как это выглядит:

Кроме того, для обозначения, давайте сделаем 𝒳₀ = 1. Это позволяет нам выполнять операции для θ₀, в противном случае у нас были бы другие размеры матрицы, что не позволяет нам выполнять матричные операции. Обратите внимание, как изменения в функции X₃ повлияют на результат функции стоимости гораздо больше, чем функция X₂.

Фактически мы можем свести уравнение нашей гипотезы к простому выражению, представив все значения тета и x как две разные матрицы. Но прежде чем я представлю это новое уравнение, я быстро рассмотрю транспонирование матрицы. Все, что делает транспонирование, это меняет местами столбец и строки матрицы, чтобы размеры подходили для выполнения операций умножения. Более простой способ подумать об этой концепции состоит в том, что если бы у вас была запись A₂₃, после транспонирования матрицы A это значение записи стало бы A₃₂.

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

Здесь особо нечего объяснять, за исключением того, что эта функция вычисляет среднее расстояние по вертикали между каждой точкой данных и точкой данных на нашей прогнозируемой линии. Единственное, что изменилось по сравнению с этой функцией и функцией с одномерной линейной регрессией, - это количество параметров и модификация нашей функции гипотез с учетом новых параметров. Также помните, что наш Xⁱ - это вектор, содержащий наши функции, а не только одно значение.

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

Что касается функции стоимости, то серьезных новых модификаций нет. Единственные отличия заключаются в количестве параметров, которые привели к небольшому изменению функции стоимости и умножению признака x на конце, который вместо этого будет входом в определенную строку матрицы признаков. (Если вы не знаете, что делает эта функция, обратитесь к статье, которую я написал об одномерной линейной регрессии, которую я привел вверху, я постарался объяснить ее просто!)

Масштабирование функций

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

Некоторые могут также применять среднюю нормализацию, которая, по сути, использует следующую форму для удовлетворения: -0,5 ≤ x ≤ 0,5, где x - это значение нашей функции. Это делается путем вычитания значения входа и среднего значения этой функции, а затем деления результата на наибольшую запись этой функции.

Скорость обучения

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

Нормальное уравнение

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

Позвольте мне привести более конкретный пример, допустим, у меня была матрица 2x2 с именем X, заполненная некоторыми числами, и вектор Y с двумя числами. Я бы вычислил произведение матрицы X и ее транспонирование. Затем я возьму обратное значение этого произведения и умножу его на произведение вектора Y и транспонированной матрицы X. Результирующий вектор будет содержать значения параметров уравнения, что приведет к наименьшей стоимости при построении графика с данными. из матрицы X и вектора Y. В то время как градиентный спуск будет повторяться снова и снова, чтобы найти значения параметров, нормальное уравнение делает это за один раз.

Теперь вы можете подумать, почему я вообще потрудился объяснить градиентный спуск, когда мы могли просто использовать нормальное уравнение. Что ж… у обоих методов есть свои плюсы и минусы. При использовании обычного уравнения вам не нужно выбирать скорость обучения (⍺), которая может привести к расхождению, и вам не нужно повторять. Однако, если у вас есть большие наборы данных, содержащие тонны и тонны данных, градиентный спуск станет лучшим вариантом. Поскольку вам нужно вычислить значение (X ^ T * X) ^ - 1, стоимость выполнения этого вычисления составляет около O (n³). (Эта нотация также называется нотацией Big O, посмотрите это видео об этом для пояснения) В любом случае, если у вас было 10 000 функций, это означает вычисление примерно с 10 ² записями - дорогостоящее вычисление даже по современным стандартам. .

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

Подробнее обо мне - меня зовут Рохан, я 16-летний ученик старшей школы, изучающий прорывные технологии, и я решил начать с искусственного интеллекта. Чтобы связаться со мной, свяжитесь со мной через мою электронную почту или LinkedIn. Я был бы более чем рад поделиться любыми мыслями или узнать о том, что может быть у вас. Кроме того, я был бы признателен, если бы вы подписались на мою ежемесячную рассылку новостей. До следующей статьи 👋!

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel