Делаем код быстрым и эффективным
В физике векторы часто представляют в виде стрелок, указывающих в пространстве, представляющих как направление, так и величину. В математике векторы выходят за пределы физического пространства и служат мощными инструментами для представления многомерных концепций. В информатике векторы принимают форму упорядоченных списков чисел.
Теперь давайте углубимся в значение векторизации в контексте линейной регрессии. Векторизация играет решающую роль в оптимизациикода для моделей линейной регрессии. Он использует подход, отличный от итеративных методов, предлагая более эффективное выполнение. Используя возможности линейной алгебры и матричных операций, векторизация обеспечивает одновременное обновление параметров, что приводит к значительному ускорению выполнения кода.
Векторизация
Благодаря векторизации линейная регрессия становится не просто математическим инструментом, но и вычислительной мощью, способствующей быстрому и эффективному обучению модели.
Формула множественной линейной регрессии с несколькими признаками:
Давайте разберем формулу множественной линейной регрессии с «n» признаками, каждый из которых представлен «Xj», где «j» обозначает конкретный признак. В данном контексте:
- «vector-x^(i)» представляет список всех функций в «i-м» месте в наших обучающих примерах.
- «Xj^(i)» соответствует значению признака «j» в «i-х» обучающих данных.
Например, если у нас есть четыре объекта, наша формула будет выглядеть так: f(X) = a1 X1 + a2 X2 + a3 X3 + a4 X4 + b
При работе с n-объектами формула принимает следующий вид: f(vector-X) = a1 X1 + a2 X2 + … + an Xn + b
Здесь у нас есть два параметра, представленные как «a» и «b»:
- «vector-a» состоит из значений [a1, a2, a3, …, an].
- «b» – это одно число.
- «vector-X» включает значения [X1, X2, X3, …, Xn].
Теперь давайте воспользуемся скалярным произведением, чтобы упростить эту формулу: f(vector-X) = вектор-a. вектор-X + b
Проще говоря, скалярное произведение двух векторов представляет собой сумму произведений их соответствующих компонентов. Эта упрощенная формула делает множественную линейную регрессию более понятной и эффективной для расчетов моделей.
Применение векторизации:
Рассмотрим «n = 3» и «b = 4».
a = np.array([a1, a2, a3]) b = 4 X = np.array([X1, X2, X3])
Здесь мы преобразовали «a» и «X» в векторы. Теперь, применяя формулу:
f = np.dot(a, X) + b # Vectorization implementation using the dot product
Если имеется ’n’ количество точек обучающих данных, без векторизации, это будет выглядеть так:
for j in range(0, n): f = f + a[j] * X[j]
Где каждая итерация от ’t[0]’ до ‘t[n]’ будет выполняться:
t[0]: f + a[0] * X[0] t[1]: f + a[1] * X[1] … t[n]: f + a[n] * X[n]
Этот процесс будет медленным. Однако при векторизации работа выполняется параллельно, и вклады суммируются следующим образом:
a[0] * X[0] + a[1] * X[1] + ... + a[n] * X[n]
Такой подход приводит к более быстрому выполнению и хорошо масштабируется даже с большими наборами данных.
Применение векторизации в градиентном спуске для множественной линейной регрессии:
Теперь давайте рассмотрим, как векторизация применяется к градиентному спуску в множественной линейной регрессии. Вот параметры и обозначения:
Предыдущие обозначения:
- Параметры: a1, a2,…,an, b
Векторные обозначения:
- Параметры:vector-a=[a1, a2,…an], b
Модель:
Предыдущие обозначения: f(vector-X) = a1 X1 +….+an Xn +b
Векторное обозначение: f(vector-X) = вектор-a . вектор-X + b
Функция стоимости:
Предыдущие обозначения: J(a1,a2,…,an,b)
Векторное обозначение: J(vector-a,b)
Градиентный спуск:
Предыдущее обозначение:
repeat { aj = aj - α d/daj J(a1,...,an,b) b = b - α d/db J(a1,...,an,b) }
Векторное обозначение:
repeat { aj = aj - α d/daj J(vector-a,b) b = b - α d/db J(vector-a,b) }
Градиентный спуск с одной особенностью:
Для одного объекта обновление «a» и «b» в градиентном спуске можно понимать следующим образом:
- «a» обновляется путем вычитания части производной функции стоимости по отношению к «a».
- «b» обновляется путем вычитания доли производной функции стоимости по отношению к «b».
- Дробь представлена как α (альфа), что является скоростью обучения. Он контролирует размер шага каждого обновления.
- Функция стоимости (J) определяет, насколько далеки прогнозы нашей модели (f(X^(i)) от фактических значений (y^(i)) для каждой точки данных.
- Мы перебираем все точки данных (Σ) и берем их среднее значение (1/m), чтобы одновременно обновлять «a» и «b».
Градиентный спуск с несколькими признаками (n=2):
При работе с несколькими функциями (n›=2) процесс обновления расширяется:
- У нас есть n функций, поэтому мы обновляем «a» для каждой функции с «a1» на «an».
- В качестве «a1» мы берем производную функции стоимости по «a1».
- Аналогично, для «a2», «a3» и т. д. мы обновляем каждое «a», вычитая часть производной.
- «b» обновляется так же, как и в случае с одним признаком.
- Эти обновления выполняются одновременно для всех значений «a» и «b».
В этом одновременном обновлении проявляется великолепная векторизация, позволяющая нам эффективно обрабатывать множество функций и быстро оптимизировать нашу модель. Это значительно ускоряет процесс по сравнению с обновлением параметров по отдельности, особенно при работе с большими наборами данных.
Теперь давайте представим это в формате, похожем на Python, для удобства использования в вашем блоге:
# Gradient Descent with One Feature a = a - α * (1/m) * Σ(f(X^(i) - y^(i)) * X^(i)) b = b - α * (1/m) * Σ(f(X^(i) - y^(i))) # Gradient Descent with Multiple Features (n>=2) for j in range(1, n+1): aj = aj - α * (1/m) * Σ(f(vector-X^(i) - y^(i)) * Xj^(i)) # Update for each 'a' b = b - α * (1/m) * Σ(f(vector-X^(i) - y^(i))) # Update 'b' simultaneously
Заключение:
Векторизация упрощает обновление параметров и вычисления, делая градиентный спуск более эффективным и масштабируемым, особенно при работе с многочисленными функциями.
В заключение, векторизация — это не просто математическая концепция; это мощный вычислительный метод, который выводит линейную регрессию и подобные модели на новую высоту скорости и эффективности.
Все, ребята, всего наилучшего в дальнейшем обучении✨ Спасибо🥳