Геометрические основы, необходимые для понимания скалярного произведения.
Делиться

Введение
Эта статья — первая из трёх частей. Каждая часть самодостаточна, поэтому вам не нужно читать остальные, чтобы её понять.
Скалярное произведение — одна из важнейших операций в машинном обучении, но её сложно понять без правильных геометрических основ. В этой первой части мы заложим эти основы:
• Единичные векторы
· Скалярная проекция
· Векторная проекция
Независимо от того, изучаете ли вы линейную алгебру впервые или хотите освежить эти понятия, я рекомендую вам прочитать эту статью.
В этой статье мы представим и объясним скалярное произведение, а в следующей статье рассмотрим его более подробно.
Раздел, посвященный проекции вектора, включен в качестве дополнительного бонуса: он полезен, но не обязателен для понимания скалярного произведения.
В следующей части более подробно рассматривается скалярное произведение: его геометрический смысл, связь с косинусным подобием и почему разница имеет значение.
В заключительной части эти идеи связываются с двумя основными областями применения: рекомендательными системами и обработкой естественного языка.
Единичный вектор
Вектор 𝐯→large mathbf{vec{v}} называется единичным вектором, если его модуль равен 1:
|𝐯→|=1LARGE mathbf{|vec{v}|} = 1
Чтобы уменьшить величину ненулевого вектора, сохранив при этом его направление, мы можем его нормализовать. Нормализация масштабирует вектор в следующий множитель:
1|𝐯→|LARGE frac{1}{|mathbf{vec{v}}|}
Нормализованный вектор 𝐯^large mathbf{hat{v}} — это единичный вектор в направлении 𝐯→large mathbf{vec{v}}:
𝐯^=𝐯→|𝐯→|LARGE begin{array}{|c|} hline mathbf{hat{v}} = frac{mathbf{vec{v}}}{|mathbf{vec{v}}|} \ hline end{array}
Обозначение 1. Отныне, всякий раз, когда мы нормализуем вектор 𝐯→large mathbf{vec{v}} или пишем 𝐯^large mathbf{hat{v}}, мы предполагаем, что 𝐯→≠0large mathbf{vec{v}} neq 0. Это обозначение, наряду с последующими, также актуально для следующих статей.
Эта операция естественным образом разделяет вектор на его величину и направление:
𝐯→=|𝐯→|⏟magnitude⋅𝐯^⏟directionLARGE begin{array}{|c|} hline rule{0pt}{2.5em} mathbf{vec{v}} = underbrace{|mathbf{vec{v}}|}_{text{magnitude}} cdot underbrace{mathbf{hat{v}}}_{text{direction}} \[4.5em] hline end{array}
Рисунок 1 иллюстрирует эту идею: 𝐯{mathbf{v}} и 𝐯^large mathbf{hat{v}} направлены в одном направлении, но имеют разные величины.

Сходство единичных векторов
В двумерном пространстве все единичные векторы лежат на единичной окружности (радиус 1, с центром в начале координат). Единичный вектор, образующий угол θ с осью x, имеет координаты (cos θ, sin θ).
Это означает, что угол между двумя единичными векторами кодирует естественный показатель сходства — как мы вскоре покажем, этот показатель равен cos θ: он равен 1, когда они направлены в одну сторону, 0, когда перпендикулярны, и −1, когда направлены в противоположные стороны.
Обозначение 2. В данной статье θ обозначает наименьший угол между двумя векторами, поэтому 0°≤θ≤180°0° leq theta leq 180° .
На практике нам неизвестен параметр θ напрямую – нам известны координаты векторов.
Мы можем показать, почему скалярное произведение двух единичных векторов: a^largehat{a} и b^largehat{b} равно cos θ, используя геометрический аргумент в три шага:
1. Поверните систему координат до тех пор, пока b^largehat{b} не окажется на оси x. Поворот не изменяет углы или величины.
2. Считайте новые координаты. После поворота вектор b^largehat{b} имеет координаты (1, 0). Поскольку a^largehat{a} — единичный вектор, расположенный под углом θ к оси x, определение единичной окружности дает его координаты как (cos θ, sin θ).
3. Перемножьте соответствующие компоненты и сложите:
a^⋅b^=ax⋅bx+ay⋅by=cosθ⋅1+sinθ⋅0=cosθLarge begin{aligned} hat{a} cdot hat{b} = a_x cdot b_x + a_y cdot b_y = \ costheta cdot 1 + sintheta cdot 0 = costheta end{aligned}
Сумма произведений отдельных компонентов называется скалярным произведением:
a→⋅b→=a1⋅b1+a2⋅b2+⋯+an⋅bnLarge boxed{ begin{aligned} vec{a} cdot vec{b} = a_1 cdot b_1 + a_2 cdot b_2 \ + cdots + a_n cdot b_n end{aligned} }
Иллюстрацию этих трех шагов см. на рисунке 2 ниже:

Всё вышеизложенное было показано в двумерном пространстве, но тот же результат справедлив в любом количестве измерений. Любые два вектора, независимо от количества измерений, всегда лежат в одной плоской плоскости. Мы можем повернуть эту плоскость так, чтобы она совпадала с плоскостью xy — и отсюда доказательство в двумерном пространстве применяется в точности.
Обозначение 3. На следующих диаграммах мы часто изображаем один из векторов (обычно b→largevec{b}) вдоль горизонтальной оси. Если вектор b→largevec{b} еще не выровнен по оси x, мы всегда можем повернуть нашу систему координат, как мы делали выше («прием с поворотом»). Поскольку поворот сохраняет все длины, углы и скалярные произведения, каждая формула, выведенная в этом положении, справедлива для любого направления вектора b→largevec{b}.
Скалярная проекция
Вектор может влиять на множество направлений одновременно, но часто нас интересует только одно направление.
Скалярная проекция отвечает на вопрос: какая часть вектора 𝒂→large boldsymbol{vec{a}} лежит вдоль направления вектора 𝒃→large boldsymbol{vec{b}}?
Это значение отрицательно, если проекция направлена в противоположную сторону от b→largevec{b}.
Аналогия с тенью
Наиболее наглядный способ представить себе скалярную проекцию — это представить её как длину тени. Представьте, что вы держите палку (вектор a → ∞ a) под углом к земле (направление вектора b → b), а источник света светит прямо вниз сверху.
Тень, которую палка отбрасывает на землю, представляет собой скалярную проекцию.
Приведенная ниже анимированная иллюстрация подтверждает эту идею:

Скалярная проекция измеряет, какая часть вектора a лежит в направлении вектора b .
Она равна длине тени, которую точка А отбрасывает на точку Б (Ву, 2023). GIF-анимация создана Клодом.
Расчет
Представьте источник света, направленный прямо вниз на линию PS (в направлении b→largevec{b}). «Тень», которую отбрасывает стрелка a→largevec{a} (стрелка от P к Q ) на эту линию, — это в точности отрезок PR. Это можно увидеть на рисунке 4.

Вывод формулы
Теперь рассмотрим треугольник PQR: перпендикуляр, проведённый из точки Q, образует прямоугольный треугольник, и его стороны равны:
- PQ = |a→|large PQ = |vec{a}| (гипотенуза).
- PRlarge PR (прилегающая сторона – тень).
- QRlarge QR (противоположная сторона – перпендикулярная составляющая).
Из этого треугольника:
- Угол между a→largevec{a} и b→largevec{b} равен θ.
- cos(θ)=PR|a→|large cos(theta) = frac{PR}{|vec{a}|} (самое базовое определение косинуса).
- Умножьте обе стороны на |a→|large|vec{a}| :
PR=|a→|cos(θ)LARGE begin{array}{|c|} hline PR = |vec{a}| cos(theta) \ hline end{array}
Сегмент 𝑷𝑹boldsymbol{PR} — это длина тени — скалярная проекция 𝒂→large boldsymbol{vec{a}} на 𝒃→large boldsymbol{vec{b}}.
Когда θ > 90°, скалярная проекция тоже становится отрицательной. Представьте, что тень переворачивается на противоположную сторону.
Как связана единичная векторная величина?
Длина тени ( PR ) не зависит от величины b→largevec{b}. Она зависит от |a→|large|vec{a}| и от θ.
При вычислении a→⋅b^largevec{a} cdot hat{b} вы спрашиваете: какая часть a→largevec{a} лежит вдоль направления b→largevec{b}? Это и есть длина тени.
Единичный вектор выступает в роли направления. Фильтр: умножение a→largevec{a} на него позволяет выделить компоненту a→largevec{a} вдоль этого направления.
Давайте рассмотрим это с помощью приема вращения. Мы располагаем b̂ вдоль оси x:
a→=(|a→|cosθ, |a→|sin(θ))Large vec{a} = (|vec{a}|costheta, |vec{a}|sin(theta))
и:
b^=(1,0)Large hat{b} = (1, 0)
Затем:
a→⋅b^=|a→|cosθ⋅1+|a→|sin(θ)⋅0=|a→|cosθLarge begin{aligned} vec{a} cdot hat{b} = |vec{a}|costheta cdot 1 \ + |vec{a}|sin(theta) cdot 0 = |vec{a}|costheta end{aligned}
Скалярная проекция 𝒂→large boldsymbol{vec{a}} в направлении 𝒃→large boldsymbol{vec{b}} имеет вид:
|a→|cosθ=a→⋅b^=a→⋅b→|b→|LARGE renewcommand{arraystretch}{2} begin{array}{|c|} hline begin{aligned} |vec{a}|costheta &= vec{a} cdot hat{b} \ &= frac{vec{a} cdot vec{b}}{|vec{b}|} end{aligned} \ hline end{array}
Геометрическая интерпретация скалярного произведения
Мы применяем тот же приём вращения ещё раз, теперь с двумя общими векторами: a→largevec{a} и b→largevec{b}.
После поворота:
a→=(|a→|cosθ, |a→|sinθ)Large vec{a} = (|vec{a}|costheta, |vec{a}|sintheta) ,
b→=(|b→|, 0)Large vec{b} = (|vec{b}|, 0)
так:
a→⋅b→=|a→|cosθ⋅|b→|+|a→|sinθ⋅0=|a→||b→|cosθLarge begin{aligned} vec{a} cdot vec{b} = |vec{a}|costheta cdot |vec{b}| \ + |vec{a}|sintheta cdot 0 = |vec{a}||vec{b}|costheta end{aligned}
Скалярное произведение 𝒂→large boldsymbol{vec{a}} и 𝒃→large boldsymbol{vec{b}} равно:
a→⋅b→=a1b1+⋯+anbn=∑i=1naibi=|a→||b→|cosθLarge renewcommand{arraystretch}{2} begin{array}{|l|} hline vec{a} cdot vec{b} = a_1 b_1+ dots + a_n b_n \ = sum_{i=1}^{n} a_i b_i = |vec{a}||vec{b}|costheta \ hline end{array}
Векторная проекция
Проекция вектора выделяет ту часть вектора 𝒂→large boldsymbol{vec{a}}, которая направлена вдоль вектора 𝒃→large boldsymbol{vec{b}}.
Аналогия с тропой
Представьте себе два маршрута, начинающихся из одной и той же точки (начала координат):
- Тропа А ведет к месту наблюдения за китами.
- Тропа B ведет вдоль побережья в другом направлении.
Вот ответы на вопрос о проекции:
Вам разрешено идти только по тропе B. Какое расстояние вам нужно пройти, чтобы оказаться как можно ближе к конечной точке тропы A?
Вы идёте по тропе B и в какой-то момент останавливаетесь. С того места, где вы остановились, вы смотрите в сторону конца тропы A, и линия, соединяющая вас с ней, образует идеальный угол 90° с тропой B. Это ключевой геометрический факт — ближайшая точка всегда находится там, где вы бы повернули на прямой угол.
Место, где вы останавливаетесь на тропе B, является проекцией точки A на точку B. Оно представляет собой «ту часть точки A, которая направлена в сторону точки B».
Оставшийся промежуток — от точки остановки до фактического конца маршрута А — это всё, что находится в точке А и не имеет отношения к направлению в точке В. Этот пример проиллюстрирован на рисунке 5 ниже: вектор, начинающийся в начале координат, направленный вдоль маршрута В и заканчивающийся в ближайшей точке, — это векторная проекция вектора a→largevec{a} на вектор b→largevec{b}.

При движении по тропе B ближайшая к конечной точке тропы A точка находится там, где соединяющий отрезок образует прямой угол с B. Эта точка является проекцией A на B. Изображение предоставлено автором (создано с помощью Claude).
Скалярная проекция отвечает на вопрос: «Как далеко вы прошли?»
Это всего лишь расстояние, одно число.
Ответ на вопрос о векторной проекции: «Где именно вы находитесь?»
Точнее: «Какое именно движение по тропе B приводит вас к ближайшей точке?»
Теперь «1,5 километра» недостаточно, нужно сказать «1,5 километра на восток вдоль побережья». Это расстояние плюс направление: стрелка, а не просто число. Стрелка начинается в начальной точке, указывает вдоль тропы B и заканчивается в ближайшей точке.
Пройденное вами расстояние — это скалярное значение проекции. Величина векторной проекции равна абсолютному значению скалярной проекции.
Ответ на вопрос о единичных векторах: «В каком направлении идет тропа B?»
Это в точности то, что обозначает b^largehat{b}. Это маршрут B, лишенный какой-либо информации о длине — только направление на побережье.
векторная проекция = (расстояние, которое вы пройдете) ⏟ скалярная проекция × (направление B) ⏟ b^begin{aligned} &text{векторная проекция} = \ &underbrace{(text{расстояние, которое вы пройдете})}_{text{скалярная проекция}} times underbrace{(text{направление B})}_{hat{b}} end{aligned}
Я понимаю, что аналогия с китом очень специфична; она была вдохновлена этим хорошим объяснением (Майкл П., 2014).
На рисунке 6 ниже показана та же диаграмма теней, что и на рисунке 4, с обозначением PR стрелкой , поскольку проекция вектора представляет собой вектор (имеющий как длину, так и направление), а не просто число.

В отличие от скалярной проекции (длины), векторная проекция представляет собой стрелку, направленную вдоль вектора b. Изображение предоставлено автором (создано с помощью программы Claude).
Поскольку проекция должна лежать вдоль оси b→largevec{b}, для PR→largevec{PR} нам необходимы две вещи:
- Его величина — это скалярная проекция: |a→|cosθlarge|vec{a}|costheta
- Его направление : b^largehat{b} (направление b→largevec{b})
Величина любого вектора равна произведению его модуля на направление (как мы видели в разделе об единичном векторе), поэтому:
PR→=|a→|cosθ⏟скалярная проекция⋅b^⏟направление b→large begin{array}{|c|} hline hspace{10pt} vec{PR} = underbrace{|vec{a}| cos theta}_{text{скалярная проекция}} cdot underbrace{hat{b}}_{text{направление } vec{b}} hspace{20pt} \ hline end{array}
Это уже формула векторной проекции. Мы можем переписать её, подставив b^=b→|b→|largehat{b} = frac{vec{b}}{|vec{b}|} и учитывая, что |a→||b→|cosθ=a→⋅b→large|vec{a}||vec{b}|costheta = vec{a} cdot vec{b}
Векторная проекция вектора 𝒂→large boldsymbol{vec{a}} в направлении вектора 𝒃→large boldsymbol{vec{b}} имеет вид:
projb→(a→)=(|a→|cosθ)b^=(a→⋅b→|b→|2)b→=(a→⋅b^)b^Large renewcommand{arraystretch}{1.5} begin{array}{|c|} hline begin{aligned} text{proj}_{vec{b}}(vec{a}) &= (|vec{a}|costheta)hat{b} \ &= left(frac{vec{a} cdot vec{b}}{|vec{b}|^2}right)vec{b} \ &= (vec{a} cdot hat{b})hat{b} end{aligned} \ hline end{array}
Краткое содержание
- Единичный вектор позволяет выделить направление вектора, отбросив его величину.
𝐯^=𝐯→|𝐯→|LARGE begin{array}{|c|} hline mathbf{hat{v}} = frac{mathbf{vec{v}}}{|mathbf{vec{v}}|} \ hline end{array}
- Скалярное произведение умножает соответствующие компоненты и суммирует их. Оно также равно произведению модулей двух векторов, умноженному на косинус угла между ними.
a→⋅b→=a1b1+⋯+anbn=∑i=1naibi=|a→||b→|cosθ renewcommand{arraystretch}{2} begin{array}{|l|} hline vec{a} cdot vec{b} = a_1 b_1+ dots + a_n b_n \ = sum_{i=1}^{n} a_i b_i = |vec{a}||vec{b}|costheta \ hline end{array}
- Скалярная проекция использует скалярное произведение для измерения того, насколько один вектор распространяется вдоль направления другого — это одно число, подобно длине тени.
|a→|cosθ=a→⋅b^=a→⋅b→|b→|Large begin{array}{|c|} hline |vec{a}|costheta = vec{a} cdot hat{b} = frac{vec{a} cdot vec{b}}{|vec{b}|} \ hline конец{массив}
- Векторная проекция идет еще дальше, возвращая фактическую стрелку, направленную в эту сторону: скалярная проекция умножает на единичный вектор.
(|a→|cosθ)b^=(a→⋅b^)b^Large renewcommand{arraystretch}{2} begin{array}{|l|} hline (|vec{a}|costheta)hat{b} = (vec{a} cdot hat{b})hat{b} \ hline end{array}
В следующей части мы используем инструменты, изученные в этой статье, чтобы по-настоящему понять скалярное произведение.
Амит Шрайбер. Все материалы от Амита Шрайбера.
Источник: towardsdatascience.com






















