Метод координатного спуска в Excel

Обновлено: 21.11.2024

Градиентный спуск – это итерационный алгоритм, который используется для минимизации функции путем поиска оптимальных параметров. Градиентный спуск можно применять к любой размерной функции, т.е. 1-D, 2-D, 3-D. В этой статье мы будем работать над поиском глобальных минимумов для параболической функции (2-D) и будем реализовывать градиентный спуск в python, чтобы найти оптимальные параметры для уравнения линейной регрессии (1-D). Прежде чем погрузиться в часть реализации, давайте удостоверимся, что набор параметров необходим для реализации алгоритма градиентного спуска. Для реализации алгоритма градиентного спуска нам требуется функция стоимости, которую необходимо минимизировать, количество итераций, скорость обучения для определения размера шага на каждой итерации при движении к минимуму, частные производные для веса и смещения для обновления параметров на каждой итерации и функцию прогнозирования.

До сих пор мы видели параметры, необходимые для градиентного спуска. Теперь давайте сопоставим параметры с алгоритмом градиентного спуска и поработаем над примером, чтобы лучше понять градиентный спуск. Рассмотрим параболическое уравнение y=4x 2 . Глядя на уравнение, мы можем определить, что параболическая функция минимальна при x = 0, то есть при x = 0, y = 0. Следовательно, x=0 является локальным минимумом параболической функции y=4x 2 . Теперь давайте посмотрим на алгоритм градиентного спуска и на то, как мы можем получить локальные минимумы, применяя градиентный спуск:

Алгоритм градиентного спуска

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

Шаг 1. Инициализация всех необходимых параметров и получение функции градиента для параболического уравнения 4x 2 . Производная x 2 равна 2x, поэтому производная параболического уравнения 4x 2 будет равна 8x.

learning_rate = 0,01 (для определения размера шага при движении к локальным минимумам)

gradient = =\frac(4*x^2) = 8*x " width="" height="" />
(Вычисление функции градиента)

Шаг 2. Выполним 3 итерации градиентного спуска:

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

Из приведенных выше трех итераций градиентного спуска мы можем заметить, что значение x уменьшается от итерации к итерации и будет медленно сходиться к 0 (локальные минимумы) при запуске градиентного спуска для большего количества итераций. Теперь у вас может возникнуть вопрос, сколько итераций мы должны запускать градиентный спуск?

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

Функция прогнозирования

Функция прогнозирования для алгоритма линейной регрессии представляет собой линейное уравнение, заданное формулой y=wx+b.

Функция стоимости

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

Функция стоимости (J) = )^(y_ - (wx_+b))^>" width="" height="" />

Здесь n — количество выборок

Частные производные (градиенты)

Вычисление частных производных для веса и смещения с использованием функции стоимости. Получаем:

=(\frac)^x_i*(y_ - (wx_+b))>" ширина="" высота="" />

=(\frac)^(y_ - (wx_+b))>" ширина="" высота="" />

Обновление параметров

Обновление веса и смещения путем вычитания умножения скорости обучения и их соответствующих градиентов.

Реализация Python для градиентного спуска

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

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

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

Выбор функций и лассо

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

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

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

Проподаватели

Эмили Фокс

Профессор машинного обучения Amazon

Карлос Гестрин

Профессор машинного обучения Amazon

Текст видео

[МУЗЫКА] Но вместо градиентного спуска или субградиентного спуска давайте воспользуемся возможностью научить действительно важной альтернативной процедуре оптимизации, которая называется Координатный спуск. Итак, давайте немного отвлечемся от алгоритма приличия по координатам, а затем опишем, как применить спуск по координатам для решения нашей задачи с лассо. Итак, наша цель здесь — минимизировать подфункцию g. Таким образом, это та же самая цель, которую мы преследуем, говорим ли мы о нашем решении в закрытой форме, градиентном спуске или этом алгоритме координатного спуска. Но, позвольте мне быть очень точным, где. Мы говорим, что хотим минимизировать по всем возможным w некоторую g(w), где здесь мы предполагаем, что g(w) является функцией нескольких переменных. Назовем его g(w0,w1.wD). Так что это W я пытаюсь написать здесь жирным шрифтом. И часто минимизация большого набора переменных может быть очень сложной задачей. Но, напротив, часто можно думать об оптимизации только одного измерения, сохраняя фиксированными все остальные измерения. Так просто для каждой координаты, когда другие фиксированы, потому что это превращается просто в проблему одномерной оптимизации. Итак, это мотивация приличной системы координат, где алгоритм спуска по координатам действительно интуитивно понятен. Мы просто начнем с инициализации нашего вектора w, который будет обозначать, что равно 0. Или вы можете использовать более умную инициализацию, если она у вас есть. И затем, пока алгоритм не сошелся, мы просто выберем координату от 0, 1 до d. И мы собираемся установить W шляпу J равным W, который минимизирует.Я напишу это как омегу, поэтому я буду искать по всем возможным значениям омеги, которые минимизируют g того, что ноль точка точка точка, вплоть до того, что j минус один, кома омега, кома что в j плюс единица вплоть до точки D. Мы здесь, эти значения, все, что обозначено шляпой, являются значениями из предыдущих итераций алгоритма отправки этой координаты. И наша цель здесь, мы просто минимизируем эту координату J. Извините, эти J здесь довольно неаккуратны. Итак, какое бы значение омеги ни минимизировало эту совместную цель, подключив омегу, мы установим его равным на этой итерации, а затем будем циклически повторять до конверсий. Итак, давайте посмотрим на небольшую иллюстрацию этого только в двух измерениях. Итак, здесь это будет просто W0, W1. И мы собираемся выбрать измерение, скажем, мы выбираем его, оптимизируя измерение W1, оставляя W0 фиксированным. Итак, я просто посмотрю на этот срез, и каков минимум на этом срезе? Что ж, минимум происходит здесь, если я смотрю на контуры, это минимум в этом измерении, и тогда я собираюсь, в этом случае, просто циклически перемещаться по своим координатам. Далее я рассмотрю сохранение фиксированного W1 и оптимизацию по сравнению с W0, и здесь был минимум, я собираюсь упасть до минимума, который здесь, и я собираюсь оптимизировать по W1, удерживая W0 фиксированным до этого значения. И я буду продолжать делать эти шаги, и если я посмотрю на путь координатного спуска, он будет выглядеть следующим образом, где я получаю движения, выровненные по оси. Итак, как мы собираемся выбрать, какую координату оптимизировать следующей? Ну есть пара вариантов. Один из них - просто выбрать координаты случайным образом. Это называется случайным или стохастическим координатным спуском. Другой вариант — циклический, когда я просто прокручиваю, ноль, один, два, три, вплоть до D, а затем снова прокручиваю. И есть и другие варианты, которые вы можете сделать. И я хочу сделать несколько замечаний по поводу координатного спуска. Во-первых, очень важно отметить, что в этом алгоритме нет размера шага. Таким образом, это отличается от градиентного спуска, где мы должны выбрать наш размер шага или график размера шага. И, надеюсь, в вашей практике вы увидели важность тщательного выбора размера шага. Так что хорошо, что не нужно выбирать этот параметр. И этот алгоритм действительно полезен во многих-многих задачах. И вы можете показать, что этот алгоритм спуска по координатам сходится для поиска целевых функций. Одним из примеров этого является ситуация, когда цель сильно выпуклая, а мы говорили о сильно выпуклых функциях ранее. Другой пример — для лассо, что очень важно, поэтому мы говорим об использовании спуска по координатам для лассо. В этом случае мы не будем приводить доказательство сходимости, но знайте, что оно действительно сходится. [МУЗЫКА]

Оптимизация — важная часть машинного обучения. В основе почти каждого алгоритма машинного обучения лежит алгоритм оптимизации.

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

  • Что такое градиентный спуск?
  • Как можно использовать градиентный спуск в таких алгоритмах, как линейная регрессия?
  • Как можно масштабировать градиентный спуск на очень большие наборы данных?
  • Какие советы помогут вам получить максимальную отдачу от градиентного спуска?

Начните свой проект с моей новой книги Master Machine Learning Algorithms, включающей пошаговые руководства и файлы таблицы Excel для всех примеров.

Приступим.

Градиентный спуск для машинного обучения
Фото Национального парка Гранд-Каньон, некоторые права защищены.

Градиентный спуск

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

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

Интуиция для градиентного спуска

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

Большая чаша
Фото Уильяма Уорби, некоторые права защищены.

Случайная позиция на поверхности чаши — это стоимость текущих значений коэффициентов (стоимость).

Дно чаши — это стоимость наилучшего набора коэффициентов, минимума функции.

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

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

Получите БЕСПЛАТНУЮ интеллект-карту алгоритмов

Пример удобной схемы алгоритмов машинного обучения.

Я создал удобную карту памяти из более чем 60 алгоритмов, организованных по типам.

Загрузите его, распечатайте и используйте.

Скачать бесплатно

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

Процедура градиентного спуска

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

Стоимость коэффициентов оценивается путем их включения в функцию и расчета стоимости.

Вычисляется производная стоимости. Производная - это понятие из исчисления и относится к наклону функции в данной точке. Нам нужно знать наклон, чтобы мы знали направление (знак) для перемещения значений коэффициента, чтобы получить более низкую стоимость на следующей итерации.

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

коэффициент = коэффициент – (альфа * дельта)

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

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

Пакетный градиентный спуск для машинного обучения

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

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

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

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

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

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

Пакетный градиентный спуск — наиболее распространенная форма градиентного спуска, описанная в машинном обучении.

Стохастический градиентный спуск для машинного обучения

Градиентный спуск может работать медленно на очень больших наборах данных.

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

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

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

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

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

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

Советы по градиентному спуску

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

  • График зависимости стоимости от времени. Соберите и нанесите на график значения стоимости, вычисляемые алгоритмом на каждой итерации. Ожидается, что хорошо работающий градиентный спуск будет снижать стоимость каждой итерации. Если она не уменьшается, попробуйте уменьшить скорость обучения.
  • Скорость обучения. Значение скорости обучения представляет собой небольшое реальное значение, например 0,1, 0,001 или 0,0001. Попробуйте разные значения для своей проблемы и посмотрите, какое из них работает лучше всего.
  • Изменение масштаба входных данных. Алгоритм быстрее достигнет минимальной стоимости, если форма функции стоимости не искажена и не искажена. Этого можно добиться, перемасштабировав все входные переменные (X) в один и тот же диапазон, например [0, 1] или [-1, 1].
  • Несколько проходов: стохастический градиентный спуск часто не требует более 1-10 проходов через набор обучающих данных, чтобы сойтись на хороших или достаточно хороших коэффициентах.
  • График средней стоимости. Обновления для каждого экземпляра обучающего набора данных могут привести к зашумленному графику стоимости с течением времени при использовании стохастического градиентного спуска. Взяв среднее значение за 10, 100 или 1000 обновлений, вы сможете лучше понять тенденцию обучения алгоритма.

Обзор

В этом посте вы узнали о градиентном спуске для машинного обучения. Вы узнали, что:

  • Оптимизация — важная часть машинного обучения.
  • Градиентный спуск – это простая процедура оптимизации, которую можно использовать со многими алгоритмами машинного обучения.
  • Пакетный градиентный спуск – это вычисление производной от всех обучающих данных перед вычислением обновления.
  • Стохастический градиентный спуск – это вычисление производной от каждого экземпляра обучающих данных и немедленное вычисление обновления.

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

Узнайте, как работают алгоритмы машинного обучения!

Посмотрите, как работают алгоритмы, за считанные минуты

<р>. только с арифметикой и простыми примерами

Он содержит объяснения и примеры 10 лучших алгоритмов, таких как:
Линейная регрессия, k-ближайших соседей, Машины опорных векторов и многое другое.

Хотите улучшить этот вопрос? Добавьте подробности и уточните проблему, отредактировав этот пост.

Закрыт 6 лет назад.

Я хочу выполнить итерацию спуска по координатам для набора точек, широта и долгота которых заданы в массивах. Итерация должна помочь мне оценить ближайшие местоположения для набора точек широты и долготы. У меня есть массив 'a' и 'b' значений lat/long. Оба массива обозначают один и тот же набор местоположений.

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

2 ответа 2

Если вы хотите рассчитать расстояние между точками с координатами широты/долготы, функция distm из пакета geosphere предоставляет несколько методов: distCosine , distHaversine , distVincentySphere и distVincentyEllipsoid . Из них distVincentyEllipsoid считается наиболее точным. В этих ответах я показал, как рассчитать расстояние между двумя разными списками точек:

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

Данные:

Обратите внимание, что я добавил переменную p с именами точек.

Исходный метод:

Сначала вы создаете матрицу расстояний с помощью:

Когда теперь вы назначаете ближайшую точку каждой точке с помощью:

каждая точка будет назначена самой себе как ближайшая точка:

Адаптация:

Вы можете предотвратить такое поведение, заменив значения 0 в матрице расстояний distmat на:

Когда теперь вы назначаете ближайшую точку каждой точке с помощью:

вы получаете правильные значения:

Думаю, я неправильно сформулировал вопрос. Я не хочу находить ближайшую точку в том же наборе из 5 точек. Я хочу повторить каждую из 5 точек 100 раз и найти ближайшую точку из этих 100 итераций. Например: я хочу повторить точку A 100 раз и найти ближайшую широту/длину среди этих 100 итераций. Точно так же я хочу сделать это для всех других точек. Короче говоря, 100 итераций для каждой точки и поиск ближайшей точки в этих итерациях, а не в наборе данных.

@Ross Не могли бы вы уточнить, что вы подразумеваете под «повторить точку А 100 раз»? Вам нужно будет предоставить нам больше информации о том, как вы хотите повторить. Как сейчас написан ваш вопрос, непонятно.

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

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

Я только что сгенерировал матрицу Wab по случайной выборке. Значения в матрице Wab не важны. Это может быть любое случайное число.

Для этого можно использовать функцию dist():

Пять ближайших точек имеют расстояния

Пары точек в матрице расстояний можно легко вывести из их индекса:

Индекс — это запись, отсчитываемая по столбцам, начиная с верхнего левого угла, поэтому mat2[5]=0,01724674 — это расстояние между точками 2 и 3, mat2[3]=1,351089 — это расстояние между точками 1 и 4 и т. д. .

Мы можем определить функцию, которая извлекает эти пары:

где второй аргумент — количество строк в исходной матрице; 5 в данном случае. Например, результат

означает, что запись номер 9 в матрице расстояний содержит расстояние между точками 3 и 4.

Изменить

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

Чтобы получить эту информацию, код можно адаптировать аналогично тому, как это предлагает @Jaap:

Читайте также: