Векторы
Вектор — упорядоченный набор чисел. В двумерном и трёхмерном случае его можно представить как направленный отрезок: есть направление (угол к оси координат) и длину (модуль). В машинном обучении чаще работают с n-мерными векторами — просто списками признаков без геометрической картинки.
Обзор раздела: Линейная алгебра. Следующий шаг — Матрицы.
Способы представления
| Способ | Пример | Когда удобно |
|---|---|---|
| Алгебра (строка) | (2, 5, -1) | Запись на бумаге, формулы |
| Алгебра (столбец) | (2; 5; -1) | Умножение матрица × вектор |
| Графика (2D) | стрелка от (0,0) к (3, 4) | Интуиция направления и длины |
Python list | [2, 5, -1] | Простые скрипты, учебные классы |
Python tuple | (2, 5, -1) | Неизменяемый набор координат |
| NumPy | np.array([2, 5, -1]) | ML, быстрые операции — см. 337 |
Скalar — одно число. Умножение вектора на скаляр растягивает или сжимает «стрелку», не меняя направления (если скаляр > 0).
Размерность: 1D, 2D, 3D, nD
- 1 компонента — точка на числовой прямой (один признак, например «возраст»).
- 2 компоненты — плоскость
(x, y); классический пример — координаты на карте. - 3 компоненты — пространство
(x, y, z); RGB-цвет(R, G, B). - n компонент — n-мерное пространство признаков: профиль пользователя из десятков полей, embedding из сотен чисел. Визуализировать сложно, но правила сложения и умножения те же, что для 2D.
Операции над векторами
Пусть u = (u₁, u₂, …, uₙ) и v = (v₁, v₂, …, vₙ) — векторы одинаковой длины n.
Сложение и вычитание
Поэлементно:
u + v = (u₁+v₁, u₂+v₂, …)
u − v = (u₁−v₁, u₂−v₂, …)
Пример: (4, 1) + (2, 5) = (6, 6); (4, 1) − (2, 5) = (2, −4).
Вычитание можно записать как u + (−1)·v.
Умножение и деление на скаляр
k · u = (k·u₁, k·u₂, …)
u / k = (u₁/k, u₂/k, …) при k ≠ 0.
Пример: 3 · (2, −1) = (6, −3); (6, −3) / 3 = (2, −1).
Длина (норма) вектора
‖v‖ = √(v₁² + v₂² + … + vₙ²)
Пример: для v = (6, 8) длина ‖v‖ = √(36 + 64) = 10.
Нормализация
единичный вектор — та же направленность, длина 1:
v̂ = v / ‖v‖
Пример: (6, 8) / 10 = (0.6, 0.8); проверка: 0.6² + 0.8² = 1.
Скалярное произведение (dot product)
u · v = u₁v₁ + u₂v₂ + … + uₙvₙ — число, не вектор.
Пример: (2, 3) · (4, −1) = 8 − 3 = **5**.
Связь с углом θ между векторами: u · v = ‖u‖ ‖v‖ cos θ. Если u · v = 0, векторы ортогональны (перпендикулярны). В рекомендациях dot product — мера «похожести» направлений; в градиентном спуске — проекция шага.
Внешнее произведение
Для столбцов u (m×1) и v (n×1) внешнее произведение даёт матрицу m×n: элемент (i,j) = uᵢ·vⱼ. Это мост к матрицам.
Пример 2×2: u = (1, 2), v = (3, −1) → матрица [[3, -1], [6, -2]].
В Python (кратко)
u = [4, 1]
v = [2, 5]
add = [a + b for a, b in zip(u, v)] # [6, 6]
import numpy as np
a = np.array([2, 3])
b = np.array([4, -1])
print(np.dot(a, b)) # 5
print(np.linalg.norm([6, 8])) # 10.0
Задачи для самопроверки
- Найдите длину и нормализованный вектор для (6, 8). Ответ: ‖v‖ = 10; (0.6, 0.8).
- Вычислите (1, −2, 3) · (4, 0, 2). Ответ: 4 + 0 + 6 = 10.
- Сложите (5, −1, 2) и (−2, 3, 1). Ответ: (3, 2, 3).
Практикум: класс Vector
Реализуйте класс с методами __sub__, __mul__ (на скаляр), dot_product, length. Полное решение и задачи на матрицы — в Lab 1129 — практикум.
class Vector:
def __init__(self, components) -> None:
self.components = components
def __str__(self) -> str:
return f"Vector: {self.components}"
def __add__(self, other):
if len(self.components) != len(other.components):
raise ValueError("Векторы должны быть одинаковой длины")
return Vector([i + j for i, j in zip(self.components, other.components)])
def __sub__(self, other):
# ваш код
...
def __mul__(self, scalar):
# ваш код
...
def dot_product(self, other):
# ваш код
...
def length(self):
# ваш код
...
Дальше: Матрицы и операции.