Линейная алгебра

Линейная алгебра — это раздел математики, который занимается линейными уравнениями, линейными преобразованиями и векторными пространствами. Линейная алгебра — это фундаментальный математический инструмент, используемый во многих аспектах машинного обучения (МО), включая предварительную обработку данных, извлечение признаков, обучение моделей и прогнозирование.

Некоторые ключевые темы линейной алгебры включают:

  • Скаляры
  • Векторы
  • Матрицы
  • Тензоры

Почему мы должны изучать линейную алгебру в ML?

  1. Генерация концепций в более высоких измерениях. Многие алгоритмы машинного обучения работают с многомерными данными, что означает, что они имеют множество функций или атрибутов. Например, изображение может быть представлено в виде многомерного массива пикселей, а текстовый документ может быть представлен в виде многомерного вектора частот слов. Линейная алгебра предоставляет инструменты для обработки и преобразования многомерных данных осмысленным образом. Например, анализ основных компонентов (PCA) — это метод линейной алгебры, используемый для уменьшения размерности многомерных данных при сохранении наиболее важной информации.
  2. Представление данных: ML часто включает работу с большими наборами данных, которые представлены в виде матриц и тензоров. Линейная алгебра предоставляет инструменты для управления и преобразования этих структур данных, что необходимо для многих алгоритмов машинного обучения.

Мы рассмотрим векторы в этом блоге.

Векторы

Вектор – это величина, которая имеет как величину, так и направление. Его можно представить графически в виде стрелки, длина которой представляет его величину, а направление представляет его направление.

Использование вектора в ML

  1. Вектор признаков. Вектор признаков — это представление входных данных, используемых в машинном обучении. Это вектор числовых признаков, описывающих характеристики данных. Вектор признаков используется в качестве входных данных для моделей машинного обучения для обучения и прогнозирования. Примеры векторов признаков включают значения пикселей в изображении, частоты слов в документе или звуковые спектральные характеристики.
  2. Метрики расстояния: векторы также используются в машинном обучении для измерения сходства или различия между двумя точками данных. Например, евклидово расстояние между двумя векторами можно использовать для измерения расстояния между двумя точками в пространстве.

Строки и столбцы вектора

В линейной алгебре вектор — это одномерный массив чисел. Существует два типа векторов: векторы-строки и векторы-столбцы:

Вектор-строка. Вектор-строка — это вектор, состоящий из одной строки чисел. Он обозначается как матрица размерами 1 x n, где n — количество элементов в векторе-строке.

Вектор-столбец. Вектор-столбец — это вектор, состоящий из одного столбца чисел. Он обозначается как матрица размерами n x 1, где n — количество элементов в векторе-столбце.

Пример вектора строк и столбцов в машинном обучении

Мы можем представить набор данных Iris как набор векторов-строк, где каждая строка представляет собой наблюдение:

[5.1, 3.5, 1.4, 0.2] # вектор-строка для наблюдения 1
[4.9, 3.0, 1.4, 0.2] # вектор-строка для наблюдения 2
[4.7, 3.2, 1.3, 0.2] # вектор-строка для наблюдения 3

[6.5, 3.0, 5.2, 2.0] # вектор-строка для наблюдения 148
[6.2, 3.4, 5.4, 2.3] # вектор-строка для наблюдения 149
[5.9, 3.0, 5.1, 1.8] # вектор-строка для наблюдения 150

В качестве альтернативы мы можем представить набор данных Iris в виде набора векторов-столбцов, где каждый столбец представляет функцию:

[5.1, 4.9, 4.7, …, 6.5, 6.2, 5.9] # вектор-столбец для длины чашелистика
[3.5, 3.0, 3.2, …, 3.0, 3.4, 3.0] # вектор-столбец для ширины чашелистика
[1.4, 1.4, 1.3, …, 5.2, 5.4, 5.1] # вектор-столбец для длины лепестка
[0.2, 0.2, 0.2, …, 2.0, 2.3, 1.8] # вектор-столбец для ширины лепестка

Мы можем использовать любое представление для выполнения задач машинного обучения, таких как классификация с использованием деревьев решений или k-ближайших соседей. Выбор представления может зависеть от конкретного алгоритма или задачи машинного обучения и может влиять на эффективность вычислений.

Расстояние от начала ||A||

Расстояние от начала координат — это обычное понятие, используемое в математике, которое также может применяться в машинном обучении. В n-мерном пространстве расстояние от начала координат вычисляется как квадратный корень из суммы квадратов отдельных координат, где каждая координата представляет измерение.

Например, в двумерном пространстве (на плоскости) расстояние от начала координат до точки (x, y) рассчитывается как:

расстояние = квадрат (x² + y²)

В трехмерном пространстве (пространство с тремя измерениями) расстояние от начала координат до точки (x, y, z) рассчитывается как:

расстояние = sqrt(x² + y² + z²)

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

Например, если у нас есть двумерный вектор (3, 4), мы можем вычислить его величину следующим образом:

величина(||A||) = sqrt(3² + 4²) = 5

Точно так же, если у нас есть трехмерный вектор (1, 2, 3), мы можем вычислить его величину как:

величина = sqrt(1² + 2² + 3²) = sqrt(14)

# distance from origin -> euclidean norm

import numpy as np

# Define an n-dimensional vector A
A = np.array([1, 2, 3, 4, 5,6,7,8,9,10,11,112,12])

# Calculate the Euclidean distance from the origin (L2 norm)
distance = np.linalg.norm(A)

print("Euclidean distance from the origin:", distance)

Output:
Euclidean distance from the origin: 114.86513831445988

Евклидово расстояние

Евклидово расстояние — это мера расстояния между двумя точками в n-мерном пространстве. Это наиболее часто используемая метрика расстояния в машинном обучении, основанная на теореме Пифагора.

В двумерном пространстве евклидово расстояние между двумя точками (x1, y1) и (x2, y2) рассчитывается как:

расстояние = sqrt((x2 — x1)² + (y2 — y1)²)

В n-мерном пространстве евклидово расстояние между двумя точками с n координатами рассчитывается как:

расстояние = sqrt((x2 — x1)² + (y2 — y1)² + … + (zn — zn-1)²)

где x1, x2, …, xn и y1, y2, …, yn — координаты двух точек в каждом измерении.

# to find euclidean distance in n-D
import numpy as np

# Define two n-dimensional vectors A and B
A = np.array([1, 2, 3, 4, 5])
B = np.array([6, 7, 8, 9, 10])

# Calculate the difference vector
difference = A - B

# Calculate the Euclidean distance between A and B (L2 norm of the difference)
distance = np.linalg.norm(difference)

print("Euclidean distance between A and B:", distance)

Output:
Euclidean distance between A and B: 11.180339887498949

Евклидово расстояние используется в различных алгоритмах машинного обучения, таких как k-ближайших соседей и кластеризация k-средних, для определения сходства или различия между двумя точками данных. Чем ближе евклидово расстояние между двумя точками, тем более похожими они считаются.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial.distance import euclidean

# 1. Generate 5 random 3D vectors
vectors = np.random.rand(5, 3)

# 2. Assign a random class (0 or 1) to each vector
classes = np.random.randint(0, 2, 5)

# 3. Plot the vectors on a 3D Matplotlib graph
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

for vec, cls in zip(vectors, classes):
    ax.quiver(0, 0, 0, vec[0], vec[1], vec[2], color=("r" if cls == 1 else "b"))

# 4. Get user input for a query point (3D vector)
query_vector = np.array(list(map(float, input("Enter the query point (3D vector) separated by space: ").split())))

# 5. Calculate the distance from the query vector to the 5 vectors and find the nearest neighbor
distances = [euclidean(query_vector, vec) for vec in vectors]
nearest_neighbor_index = np.argmin(distances)

# 6. Output the class of the nearest neighbor
print("The class of the nearest neighbor is:", classes[nearest_neighbor_index])

# 7. Plot the query vector with a different color
ax.quiver(0, 0, 0, query_vector[0], query_vector[1], query_vector[2], color="g")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_zlabel("Z-axis")

plt.show()

Наконец, код выводит класс ближайшего соседа и отображает вектор запроса другим цветом.

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

Скалярное сложение/вычитание (сдвиг)

Скалярное сложение/вычитание, также известное как сдвиг, представляет собой простую операцию в линейной алгебре, которая включает добавление или вычитание скалярного значения к/от каждого элемента вектора или матрицы.

Например, если у нас есть вектор v = [1, 2, 3] и мы хотим сдвинуть его на 2, мы можем добавить 2 > к каждому элементу вектора, чтобы получить v' = [3, 4, 5]. Точно так же, если мы вычтем 2 из каждого элемента v, мы получим v’’ = [-1, 0, 1].

Некоторые распространенные приложения сдвига в ML включают:

  • Центрирование данных: сдвиг данных таким образом, чтобы среднее значение каждой функции было равно нулю. Это может помочь некоторым алгоритмам быстрее сходиться, а также может помочь с интерпретируемостью.
  • Масштабирование данных: сдвиг данных таким образом, чтобы минимальное значение каждой функции было равно нулю (или другому значению), может помочь привести функции в аналогичный диапазон, что может ускорить обучение некоторых алгоритмов (например, нейронных сетей) и повысить их производительность.
  • Увеличение данных: добавление случайных значений к каждому пикселю изображения может помочь искусственно расширить набор данных, что может помочь повысить производительность алгоритмов машинного обучения.

Давайте разберемся со средним центрированием!

Среднее центрирование

Центрирование по среднему значению — это распространенный метод предварительной обработки данных, используемый в машинном обучении. Он включает в себя сдвиг значений данных таким образом, чтобы среднее (среднее) каждого признака было равно нулю.

Для среднего центра набора данных мы сначала вычисляем среднее значение каждого признака (столбца) в наборе данных. Затем мы вычитаем среднее значение из каждой точки данных в этой функции. Это гарантирует, что среднее значение признака центрировано на нуле.

Центрирование по среднему значению — это полезный метод предварительной обработки в машинном обучении, который можно применять к различным задачам, таким как:

  • Анализ главных компонентов (PCA)
  • Линейная регрессия
  • Алгоритмы оптимизации на основе градиента
  • Алгоритмы кластеризации
  • Регуляризация
import numpy as np
import matplotlib.pyplot as plt

# Generate random 2D data with 100 points
data = np.random.rand(100, 2)

# Calculate the mean of the data along each dimension
data_mean = np.mean(data, axis=0)

# Perform mean centering
centered_data = data - data_mean

# Plot the original data
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], label="Original Data")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.title("Before Mean Centering")
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.legend()

# Plot the mean-centered data
plt.subplot(1, 2, 2)
plt.scatter(centered_data[:, 0], centered_data[:, 1], label="Mean-Centered Data", color="orange")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.title("After Mean Centering")
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.legend()

plt.show()

Скалярное произведение

Скалярное произведение, также известное как скалярное произведение или внутреннее произведение, представляет собой операцию между двумя векторами, результатом которой является скаляр. Скалярный продукт вычисляется путем взятия суммы произведения соответствующих элементов двух векторов. Математически скалярное произведение двух векторов a и b обозначается как a ⋅ b и может быть рассчитано как:

a ⋅ b = a1 * b1 + a2 * b2 + … + an * bn

где a1, a2, …, an и b1, b2, …, bn — соответствующие элементы двух векторов.

import numpy as np

# Define three vectors
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])

print(np.dot(A, B))
print(A@B)

Output:
32
32

Использование скалярного произведения в векторных приложениях

Вот несколько примеров использования скалярных произведений в векторных приложениях:

  1. Проекция: скалярное произведение можно использовать для нахождения проекции одного вектора на другой. Для двух векторов a и b проекция an на b может быть вычислена как (a · b / ||b||²) * b, где ||b|| является величиной b.
  2. Ортогональность: два вектора ортогональны (перпендикулярны) тогда и только тогда, когда их скалярное произведение равно нулю. Это свойство используется в различных приложениях, таких как определение угла между двумя векторами или проверка линейной независимости набора векторов.
  3. Сходство: скалярное произведение можно использовать для измерения сходства между двумя векторами. Косинусное сходство между двумя векторами a и b можно вычислить как (a · b) / (||a|| * ||b||), где ||a|| и ||б|| являются величинами векторов. Косинусное сходство колеблется от -1 (непохожее) до 1 (похожее).
  4. Машинное обучение: скалярный продукт используется в различных алгоритмах машинного обучения, таких как линейная регрессия, логистическая регрессия и машины опорных векторов. В этих алгоритмах скалярное произведение используется для вычисления расстояния или сходства между точками данных или для вычисления границы решения между классами.

Угол между векторами

Скалярное произведение двух векторов можно использовать для вычисления угла между ними. Для двух векторов A и B скалярное произведение A и B определяется как:

А · В = ||А|| ||Б|| потому что (θ)

где ||А|| и ||В|| — величины (длины) векторов A и B, а θ — угол между ними.

Преобразовывая уравнение, получаем:

cos(θ) = (A · B) / (||A|| ||B||)

Взяв арккосинус обеих сторон, получим:

θ = cos^-1((A · B) / (||A|| ||B||))

Если скалярное произведение двух векторов положительно, то угол между ними острый (меньше 90 градусов). Если скалярное произведение отрицательное, то угол тупой (больше 90 градусов). Если скалярное произведение равно нулю, то векторы перпендикулярны.

import numpy as np

# Define two vectors
A = np.array([1, 2, 3])
B = np.array([-4, -5, -6])
C = np.array([5,5,5])


# Calculate the cosine similarity
cosine_similarity = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))

print("Cosine similarity between A and B:", cosine_similarity)

# Calculate the cosine similarity
cosine_similarity = np.dot(A, C) / (np.linalg.norm(A) * np.linalg.norm(C))

print("Cosine similarity between A and C:", cosine_similarity)

Output:
osine similarity between A and B: -0.9746318461970762
Cosine similarity between A and C: 0.9258200997725513

Гиперплоскость

Гиперплоскость в трехмерном пространстве — это двумерное подпространство, которое можно представить себе как плоский лист или плоскость.

В машинном обучении гиперплоскости часто используются для разделения точек данных в многомерном пространстве. Например, в задачах бинарной классификации у нас может быть набор данных с двумя классами точек, которые не являются линейно разделимыми в исходном пространстве признаков. Однако, сопоставляя объекты с многомерным пространством, мы можем найти гиперплоскость, которая может разделить два класса. Это основа для многих популярных алгоритмов машинного обучения, таких как машины опорных векторов.

Уравнение гиперплоскости в n-мерном пространстве можно записать так:

w0 + w1x1 + w2x2 + … + wnxn = 0

где w0, w1, w2, …, wn — коэффициенты гиперплоскости, x1, x2, …, xn — координаты точки пространства, 0 — константа.

Чтобы понять это уравнение, рассмотрим простой пример в двумерном пространстве. Гиперплоскость в этом пространстве — это просто линия, и уравнение линии можно записать так:

w1x1 + w2x2 + w0 = 0

где w0, w1 и w2 — коэффициенты прямой, а x1 и x2 — координаты точки на прямой.

Это уравнение можно переформулировать так:

w1x1 + w2x2 = -w0

что является стандартной формой уравнения прямой. Это уравнение говорит нам, что любая точка (x1, x2) на прямой должна удовлетворять этому уравнению. Геометрически это означает, что скалярное произведение вектора [w1, w2] на вектор [x1, x2] равно -w_0.