Перейти к основному содержимому

Векторы

Архитектору Инженеру

Вектор — упорядоченный набор чисел. В двумерном и трёхмерном случае его можно представить как направленный отрезок: есть направление (угол к оси координат) и длину (модуль). В машинном обучении чаще работают с n-мерными векторами — просто списками признаков без геометрической картинки.

Обзор раздела: Линейная алгебра. Следующий шаг — Матрицы.


Способы представления

СпособПримерКогда удобно
Алгебра (строка)(2, 5, -1)Запись на бумаге, формулы
Алгебра (столбец)(2; 5; -1)Умножение матрица × вектор
Графика (2D)стрелка от (0,0) к (3, 4)Интуиция направления и длины
Python list[2, 5, -1]Простые скрипты, учебные классы
Python tuple(2, 5, -1)Неизменяемый набор координат
NumPynp.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‖

Пример: (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

Подробнее — NumPy и Lab 1129.


Задачи для самопроверки

  1. Найдите длину и нормализованный вектор для (6, 8). Ответ: ‖v‖ = 10; (0.6, 0.8).
  2. Вычислите (1, −2, 3) · (4, 0, 2). Ответ: 4 + 0 + 6 = 10.
  3. Сложите (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):
# ваш код
...

Дальше: Матрицы и операции.