Вектори в Data Science: Основні Операції та Геометричний Зміст

Вектори знайомі нам ще з геометрії. Ми можемо задавати їх координатами, знаходити довжину, додавати, віднімати та обчислювати скалярний добуток. Але в Data Science поняття вектора отримує ще одне важливе значення.

У вигляді векторів можна представити інформацію про людину, товар, автомобіль, зображення або навіть текст. Після цього математичні операції над векторами дозволяють порівнювати об’єкти, визначати відстань між ними та шукати найбільш схожі дані.

Саме тому вектори є одним із фундаментальних математичних інструментів Data Science та Machine Learning. Розберемося, як знайома математика працює з реальними даними.

Вектор в Data Science: Від Координат до Ознак Об’єкта

У математиці вектор можна записати як впорядкований набір чисел:

\[
\mathbf{x}=(x_1,x_2,\ldots,x_n).
\]

Числа \( x_1,x_2,\ldots,x_n \) називають координатами або компонентами вектора.

У Data Science ці компоненти часто відповідають ознакам об’єкта.

Наприклад, нехай ми аналізуємо квартири. Для кожної квартири відомі три характеристики:

  • Площа.
  • Кількість кімнат.
  • Поверх.

Тоді квартиру площею \( 65 \) квадратних метрів, з трьома кімнатами на п’ятому поверсі можна представити вектором

\[
\mathbf{x}=(65,3,5).
\]

Тут перша координата описує площу, друга — кількість кімнат, а третя — поверх.

Інша квартира може мати вектор

\[
\mathbf{y}=(72,3,7).
\]

З математичної точки зору це просто два вектори у тривимірному просторі. Але з точки зору Data Science — це вже два об’єкти набору даних.

Таке представлення часто називають вектором ознак.

Причому кількість вимірів зовсім не обмежується двома або трьома.

Наприклад, фотографія може описуватися тисячами або навіть мільйонами чисел. Текст після відповідного перетворення також можна представити вектором великої розмірності.

Людині важко уявити простір із сотнями вимірів. Для математичних алгоритмів це не проблема: правила роботи з такими векторами залишаються практично тими самими.

Операції з Векторами: Як Математика Працює з Даними

Нехай задано два вектори однакової розмірності:

\[
\begin{gathered}
\mathbf{x}=(x_1,x_2,\ldots,x_n),\\[4pt]
\mathbf{y}=(y_1,y_2,\ldots,y_n).
\end{gathered}
\]

Їх можна додавати та віднімати покоординатно.

Сума має вигляд

\[
\mathbf{x}+\mathbf{y}
=
(x_1+y_1,x_2+y_2,\ldots,x_n+y_n).
\]

Різниця:

\[
\mathbf{x}-\mathbf{y}
=
(x_1-y_1,x_2-y_2,\ldots,x_n-y_n).
\]

Також вектор можна помножити на число:

\[
\lambda\cdot\mathbf{x}
=
(\lambda\cdot x_1,\lambda\cdot x_2,\ldots,\lambda\cdot x_n).
\]

Навіщо такі прості операції потрібні під час аналізу даних?

Розглянемо невеликий приклад.

Нехай маємо результати трьох тестів двох студентів:

\[
\begin{gathered}
\mathbf{x}=(70,80,90),\\[4pt]
\mathbf{y}=(80,70,100).
\end{gathered}
\]

Знайдемо середні результати.

Спочатку додамо вектори:

\[
\mathbf{x}+\mathbf{y}
=
(70+80,80+70,90+100)
=
(150,150,190).
\]

Тепер помножимо отриманий вектор на \( 0.5 \):

\[
0.5\cdot(\mathbf{x}+\mathbf{y})
=
(75,75,95).
\]

Отже, вектор

\[
(75,75,95)
\]

описує середні результати двох студентів за трьома тестами.

Ця проста ідея має значно ширше застосування. Середні значення векторів використовуються під час аналізу груп об’єктів, пошуку центрів груп та в алгоритмах кластеризації.

Довжина Вектора та Відстань: Наскільки Об’єкти Відрізняються

Однією з найважливіших характеристик вектора є його довжина, або норма.

Для вектора

\[
\mathbf{x}=(x_1,x_2,\ldots,x_n)
\]

евклідова довжина визначається формулою

\[
\|\mathbf{x}\|
=
\sqrt{x_1^2+x_2^2+\ldots+x_n^2}.
\]

Для двовимірного вектора

\[
\mathbf{x}=(3,4)
\]

отримаємо

\[
\|\mathbf{x}\|
=
\sqrt{3^2+4^2}
=
\sqrt{9+16}
=
5.
\]

У Data Science ще цікавішою є відстань між двома векторами.

Вектори в Data Science — евклідова відстань між двома векторами у просторі ознак

Якщо задано

\[
\mathbf{x}=(x_1,x_2,\ldots,x_n)
\]

і

\[
\mathbf{y}=(y_1,y_2,\ldots,y_n),
\]

то евклідова відстань між ними дорівнює

\[
d(\mathbf{x},\mathbf{y})
=
\sqrt{
(x_1-y_1)^2+
(x_2-y_2)^2+
\ldots+
(x_n-y_n)^2
}.
\]

Або коротше:

\[
d(\mathbf{x},\mathbf{y})
=
\|\mathbf{x}-\mathbf{y}\|.
\]

Навіщо нам ця відстань?

Припустимо, що два об’єкти мають дуже схожі характеристики. Тоді відповідні вектори повинні розташовуватися близько один до одного. Якщо характеристики сильно відрізняються, відстань між векторами буде більшою.

Саме ця проста геометрична ідея лежить в основі багатьох методів пошуку найближчих сусідів.

Нехай клієнта описують три характеристики:

  • Вік.
  • Кількість покупок за місяць.
  • Середня сума покупки.

Маємо

\[
\begin{gathered}
\mathbf{x}=(25,3,72),\\[4pt]
\mathbf{y}=(27,4,75).
\end{gathered}
\]

Знайдемо відстань між ними:

\[
d(\mathbf{x},\mathbf{y})
=
\sqrt{
(25-27)^2+
(3-4)^2+
(72-75)^2
}.
\]

Отже,

\[
d(\mathbf{x},\mathbf{y})
=
\sqrt{4+1+9}
=
\sqrt{14}
\approx 3.742.
\]

Чим меншою є відстань, тим ближче розташовані точки у просторі ознак.

Але тут прихована одна важлива проблема.

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

Саме тому перед використанням багатьох алгоритмів Machine Learning дані масштабують або стандартизують. Це дозволяє зробити вплив різних ознак більш співмірним.

Цю тему ми детальніше розглянемо окремо, коли говоритимемо про підготовку даних.

Скалярний Добуток: Як Порівнювати Напрями Векторів

Ще одна важлива операція — скалярний добуток.

Для векторів

\[
\mathbf{x}=(x_1,x_2,\ldots,x_n)
\]

та

\[
\mathbf{y}=(y_1,y_2,\ldots,y_n)
\]

він визначається так:

\[
\mathbf{x}\cdot\mathbf{y}
=
x_1\cdot y_1+x_2\cdot y_2+\ldots+x_n\cdot y_n.
\]

Наприклад, нехай

\[
\begin{gathered}
\mathbf{x}=(2,3,1),\\[4pt]
\mathbf{y}=(4,2,2).
\end{gathered}
\]

Тоді

\[
\mathbf{x}\cdot\mathbf{y}
=
2\cdot4+3\cdot2+1\cdot2
=
8+6+2
=
16.
\]

Проте скалярний добуток має ще й геометричний зміст:

\[
\mathbf{x}\cdot\mathbf{y}
=
\|\mathbf{x}\|\cdot\|\mathbf{y}\|\cdot\cos(\theta),
\]

де \( \theta \) — кут між векторами.

Звідси

\[
\cos(\theta)
=
\frac{\mathbf{x}\cdot\mathbf{y}}
{\|\mathbf{x}\|\cdot\|\mathbf{y}\|}.
\]

Ця формула приводить нас до дуже корисного для Data Science поняття — косинусної схожості.

Косинусна Схожість: Як Знайти Подібні Об’єкти

Косинусна схожість визначається формулою

\[
\operatorname{cosine}(\mathbf{x},\mathbf{y})
=
\frac{\mathbf{x}\cdot\mathbf{y}}
{\|\mathbf{x}\|\cdot\|\mathbf{y}\|}.
\]

Вона дозволяє порівнювати не стільки абсолютні величини координат, скільки напрямки векторів.

Для ненульових векторів із невід’ємними компонентами значення, близьке до \( 1 \), означає, що їхні напрямки дуже схожі.

Вектори в Data Science — кут між векторами та геометричний зміст косинусної схожості

Розглянемо цікавіший приклад.

Нехай чотири координати вектора відповідають оцінкам чотирьох жанрів фільмів.

Перший користувач має профіль

\[
\mathbf{a}=(5,4,1,0).
\]

Другий:

\[
\mathbf{b}=(4,5,1,0).
\]

Третій:

\[
\mathbf{c}=(0,1,4,5).
\]

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

Знайдемо скалярний добуток перших двох векторів:

\[
\mathbf{a}\cdot\mathbf{b}
=
5\cdot4+
4\cdot5+
1\cdot1+
0\cdot0
=
41.
\]

Довжина першого вектора:

\[
\|\mathbf{a}\|
=
\sqrt{5^2+4^2+1^2}
=
\sqrt{42}.
\]

Аналогічно

\[
\|\mathbf{b}\|
=
\sqrt{42}.
\]

Тоді косинусна схожість дорівнює

\[
\operatorname{cosine}(\mathbf{a},\mathbf{b})
=
\frac{41}{\sqrt{42}\cdot\sqrt{42}}
=
\frac{41}{42}
\approx 0.976.
\]

Отримали значення, дуже близьке до \( 1 \). Отже, напрямки цих векторів дуже подібні.

Порівняємо тепер першого і третього користувачів:

\[
\operatorname{cosine}(\mathbf{a},\mathbf{c})
\approx 0.19.
\]

Схожість значно менша.

Математика підтвердила те, що ми могли приблизно побачити за самими оцінками.

Цей принцип використовують під час порівняння векторних представлень різних об’єктів. Наприклад, такими об’єктами можуть бути користувачі, товари або документи.

У спрощеному вигляді ця ідея вже нагадує рекомендаційну систему: ми знаходимо об’єкти зі схожими характеристиками та використовуємо отриману інформацію для подальшого аналізу.

Вектори в Python: Від Формули до Програмного Коду

До цього моменту ми працювали з векторами математично. Тепер подивимося, як ті самі операції виконуються за допомогою Python.

Для роботи з числовими векторами зручно використовувати бібліотеку NumPy.

Нехай маємо два вектори:

\[
\begin{gathered}
\mathbf{x}=(2,4,6),\\[4pt]
\mathbf{y}=(4,6,8).
\end{gathered}
\]

Створимо їх як масиви:

import numpy as np
 
x = np.array([2, 4, 6])
y = np.array([4, 6, 8])

Тепер можемо виконати основні операції:

vector_sum = x + y
vector_difference = x - y
scaled_vector = 2 * x
 
x_length = np.linalg.norm(x)
distance = np.linalg.norm(x - y)
dot_product = np.dot(x, y)
 
print("Sum:", vector_sum)
print("Difference:", vector_difference)
print("Vector multiplied by 2:", scaled_vector)
print("Length of x:", round(x_length, 3))
print("Distance:", round(distance, 3))
print("Dot product:", dot_product)

Програма виведе:

Sum: [ 6 10 14]
Difference: [-2 -2 -2]
Vector multiplied by 2: [ 4  8 12]
Length of x: 7.483
Distance: 3.464
Dot product: 80

Зверніть увагу, наскільки близько програмний код повторює математичний запис.

Математично пишемо

\[
\mathbf{x}+\mathbf{y},
\]

а в Python:

x + y

Математично:

\[
2\cdot\mathbf{x},
\]

у Python:

2 * x

Для скалярного добутку

\[
\mathbf{x}\cdot\mathbf{y}
\]

можемо використати:

np.dot(x, y)

Довжину вектора можна знайти так:

np.linalg.norm(x)

а відстань між двома векторами:

np.linalg.norm(x - y)

Саме тут добре видно зв’язок між математикою та програмуванням. Формули, які ми розглядали вище, практично безпосередньо перетворюються на команди Python.

Для повноти обчислимо також косинусну схожість:

cosine_similarity = np.dot(x, y) / (
    np.linalg.norm(x) * np.linalg.norm(y)
)
 
print("Cosine similarity:", round(cosine_similarity, 3))

Таким чином, знаючи основні операції з векторами, ми вже можемо реалізувати прості методи порівняння даних.

Практичний Приклад: Пошук Найбільш Схожого Тренування

Тепер використаємо отримані знання для невеликої задачі аналізу даних.

Припустимо, що ми аналізуємо тренувальні плани п’яти спортсменів. Кожен вектор показує, скільки хвилин за тиждень спортсмен витрачає на чотири види активності:

  • Біг.
  • Велотренування.
  • Силові вправи.
  • Розтягування.

Маємо п’ять тренувальних профілів:

\[
\begin{gathered}
\mathbf{u}_1=(40,30,20,10),\\[4pt]
\mathbf{u}_2=(38,32,18,12),\\[4pt]
\mathbf{u}_3=(15,20,35,30),\\[4pt]
\mathbf{u}_5=(25,35,15,25).
\end{gathered}
\]

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

Запишемо ці дані у Python:

import numpy as np
 
athletes = np.array([
    [40, 30, 20, 10],
    [38, 32, 18, 12],
    [15, 20, 35, 30],
    [30, 20, 25, 25],
    [25, 35, 15, 25]
])
 
target = athletes[0]

Кожен рядок масиву athletes є окремим вектором ознак одного спортсмена.

Створимо функцію для обчислення косинусної схожості:

def cosine_similarity(a, b):
    return np.dot(a, b) / (
        np.linalg.norm(a) * np.linalg.norm(b)
    )

Тепер порівняємо першого спортсмена з усіма іншими:

for i in range(1, len(athletes)):
    similarity = cosine_similarity(target, athletes[i])
 
    print(
        "Athlete",
        i + 1,
        "- similarity:",
        round(similarity, 3)
    )

Програма виведе:

Athlete 2 - similarity: 0.997
Athlete 3 - similarity: 0.766
Athlete 4 - similarity: 0.922
Athlete 5 - similarity: 0.914

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

Для цього збережемо найбільше знайдене значення та номер відповідного спортсмена:

best_athlete = None
best_similarity = -1
 
for i in range(1, len(athletes)):
    similarity = cosine_similarity(target, athletes[i])
 
    if similarity > best_similarity:
        best_similarity = similarity
        best_athlete = i
 
print("Most similar athlete:", best_athlete + 1)
print("Similarity:", round(best_similarity, 3))

Результат:

Most similar athlete: 2
Similarity: 0.997

Цей результат легко пояснити, якщо порівняти початкові вектори:

\[
\begin{gathered}
\mathbf{u}_1=(40,30,20,10),\\[4pt]
\mathbf{u}_2=(38,32,18,12).
\end{gathered}
\]

У першого спортсмена найбільше часу припадає на біг, дещо менше — на велотренування, після цього йдуть силові вправи та розтягування. У другого спортсмена розподіл часу між цими видами активності майже такий самий.

Інші тренувальні профілі відрізняються сильніше. Наприклад, третій спортсмен значно більше часу приділяє силовим вправам та розтягуванню, тому напрямок його вектора помітно відрізняється від напрямку вектора першого спортсмена.

Таким чином, косинусна схожість дозволяє чисельно оцінити, наскільки подібною є структура двох векторів, навіть якщо самі вектори описують реальні об’єкти або процеси.

Звичайно, у справжній задачі Data Science кількість спортсменів може вимірюватися тисячами, а кожен тренувальний профіль може містити десятки різних характеристик. Проте математичний принцип залишатиметься таким самим: об’єкт → набір ознак → вектор → математичне порівняння векторів.

Саме цей перехід є одним із ключових для розуміння математики Data Science.

Вектори в Machine Learning: Чому Це Лише Початок

Ми почали зі звичайного запису

\[
\mathbf{x}=(x_1,x_2,\ldots,x_n),
\]

але побачили, що за ним може приховуватися реальний об’єкт із набору даних.

Вектор може описувати квартиру, клієнта, студента, вподобання користувача або тренувальний профіль спортсмена. Відстань між векторами допомагає визначати, наскільки об’єкти відрізняються, а скалярний добуток і косинусна схожість дозволяють порівнювати їхні напрямки.

Такі операції є основою для багатьох методів аналізу даних. Вони використовуються під час пошуку схожих об’єктів, кластеризації, рекомендацій та інших задач Machine Learning.

Це лише перший крок. Коли таких векторів стає багато, їх природно об’єднати в одну структуру — матрицю. Наприклад, якщо кожен рядок містить характеристики одного об’єкта, то весь набір даних можна представити матрицею:

\[
X=
\begin{pmatrix}
x_{11} & x_{12} & \ldots & x_{1n}\\
x_{21} & x_{22} & \ldots & x_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
x_{m1} & x_{m2} & \ldots & x_{mn}
\end{pmatrix}.
\]

Тут \( m \) — кількість об’єктів, а \( n \) — кількість їхніх ознак.

І саме звідси логічно перейти до наступної теми — матриць у Machine Learning, де окремі вектори перетворюються на повноцінні набори даних.