В постоянно расширяющемся мире науки о данных одной из фундаментальных проблем, с которыми мы сталкиваемся, является проклятие размерности. Это проклятие возникает, когда наборы данных содержат большое количество функций или переменных, что затрудняет эффективную работу с ними и часто приводит к снижению производительности модели. На помощь приходят методы уменьшения размерности, предлагающие способы преобразования многомерных данных в более управляемое и информативное представление. Традиционно линейные методы, такие как анализ главных компонентов (PCA), факторный анализ, анализ независимых компонентов (ICA) и факторизация неотрицательной матрицы, были предпочтительным выбором для уменьшения размерности. Однако эти линейные методы имеют ограничения, особенно при работе со сложными нелинейными связями в данных. Эта статья исследует мир уменьшения размерности, проливая свет как на линейные, так и на нелинейные методы, уделяя особое внимание преимуществам нелинейных, воспроизводимых методов, таких как аппроксимация и проекция равномерного многообразия (UMAP).

Линейное уменьшение размерности

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

Анализ главных компонентов (PCA) – уменьшение дисперсии:

PCA идентифицирует в данных ортогональные оси (главные компоненты), ранжированные по их дисперсии. Первые несколько основных компонентов часто содержат наиболее важную информацию. Логика алгоритма состоит из нескольких шагов:

  1. Центрируйте данные
  2. Ковариационная матрица используется для понимания различий в данных и направлений этих отклонений. Ковариация между двумя признаками показывает, насколько они изменяются вместе. Ковариационная матрица суммирует отношения между всеми парами признаков.
  3. Следующий шаг называется «Разложение по собственным значениям». Затем PCA вычисляет собственные значения и собственные векторы ковариационной матрицы. Собственные векторы представляют направления (главные компоненты), вдоль которых данные изменяются больше всего, а собственные значения указывают величину дисперсии в этих направлениях.
  4. Выбор главных компонентов: PCA упорядочивает собственные векторы по соответствующим собственным значениям в порядке убывания. Собственный вектор с наибольшим собственным значением является первым главным компонентом, вектор со вторым по величине собственным значением является вторым главным компонентом и так далее. Обычно вы выбираете подмножество этих основных компонентов, чтобы уменьшить размерность ваших данных.
  5. Проекция. На последнем этапе вновь найденные основные компоненты используются для преобразования исходных данных в уменьшенные данные. Обратите внимание, что компоненты являются иерархическими, например, первый компонент всегда отвечает за наибольшую дисперсию, и что каждый последующий компонент будет представлять все меньшую и меньшую дисперсию.

Вот пример Python:

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
pca = PCA(n_components=4)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = pca.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")

# Lets have a look at the last 2 features, we should expect little information
plt.scatter(reduced_data[:,2], reduced_data[:,3], c=target)
plt.title("Using the 3rd and 4th Dimensions shows poor information")

Факторный анализ — скрытые переменные:

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

from sklearn.decomposition import FactorAnalysis
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
fa = FactorAnalysis(n_components=4)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = fa.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")
plt.show()

# Lets have a look at the last 2 features, we should expect little information
plt.scatter(reduced_data[:,2], reduced_data[:,3], c=target)
plt.title("Using the 3rd and 4th Dimensions shows poor information")
plt.show()

Анализ независимых компонентов (ICA) — Статистически независимые переменные:
Анализ независимых компонентов (ICA) — это еще один метод уменьшения размерности, который отличается тем, что предполагает, что наблюдаемые данные представляют собой смесь независимых источников. Цель ICA — разделить этот составной сигнал, извлекая исходные источники, статистически независимые друг от друга. Это делает ICA особенно ценным при работе с данными, состоящими из отдельных, негауссовских источников, поскольку он подчеркивает восстановление основных независимых компонентов для анализа и интерпретации.

from sklearn.decomposition import FastICA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
ica = FastICA(n_components=4)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = ica.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")

# Lets have a look at the last 2 features, we should expect little information
plt.scatter(reduced_data[:,2], reduced_data[:,3], c=target)
plt.title("Using the 3rd and 4th Dimensions shows poor information")

Неотрицательная матричная факторизация (NMF) — аддитивные матрицы:
Ключевое отличие NMF заключается в ограничении неотрицательности, что делает его особенно полезным для наборов данных, в которых преобладают отрицательные значения или проблемы интерпретируемости. В то время как PCA генерирует ортогональные компоненты, которые невозможно интерпретировать напрямую, NMF извлекает аддитивные компоненты, которые по своей сути неотрицательны. Это свойство полезно при работе с данными, где представления на основе частей более значимы, например, обработка изображений или тематическое моделирование в текстовых данных, обеспечивая более интуитивно понятный и интерпретируемый подход к уменьшению размерности.

from sklearn.decomposition import NMF
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
nmf = NMF(n_components=4)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = nmf.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")
plt.show()

# Lets have a look at the last 2 features, we should expect little information
plt.scatter(reduced_data[:,2], reduced_data[:,3], c=target)
plt.title("Using the 3rd and 4th Dimensions shows poor information")
plt.show()

Нелинейное уменьшение размерности

Нелинейные методы уменьшения размерности предназначены для выявления сложных взаимосвязей в многомерных данных. Давайте углубимся в некоторые нелинейные методы, подчеркнем их преимущества и приведем примеры на Python, где это возможно.

PCA ядра:
PCA ядра расширяет PCA за счет использования функций ядра для фиксации нелинейных связей. Он отображает данные в многомерное пространство, где можно применить линейный PCA. Пример с ядром RBF:

from sklearn.decomposition import KernelPCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
pca = KernelPCA(kernel="rbf", n_components=4)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = pca.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")
plt.show()

Аппроксимация и проекция равномерного многообразия (UMAP):

UMAP — это современная технология нелинейного уменьшения размерности. Он сохраняет как глобальные, так и локальные структуры данных, что делает его пригодным для различных типов данных. Это также очень эффективно, особенно при использовании RAPIDS. Вот пример:

from cuml import UMAP
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
umap = UMAP(n_components=2, n_neighbors=8, random_state=42)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = umap.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")
plt.show()

t-Distributed Stochastic Neighbor Embedded (t-SNE):
t-SNE минимизирует расхождение между распределениями вероятностей, эффективно визуализируя многомерные данные в меньших измерениях. Он отлично подходит для визуализации и сохранения локальных структур и кластеров в данных, но может не так эффективно захватывать глобальные структуры, но может требовать больших вычислительных ресурсов. Более того, из-за его вероятностного характера воспроизведение одной и той же визуализации может оказаться сложной задачей. По этой причине t-SNE обычно используется для визуализации данных, особенно в сценариях, где сохранение кластеров и локальных структур имеет важное значение.

from cuml import TSNE
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# get data
data = load_iris()["data"]
target = load_iris()["target"]

# create transformer
tsne = TSNE(n_components=2, random_state=42)

# transform data, 
# note that you can´t get more features then what you started out with.
reduced_data = tsne.fit_transform(data)

# Lets create an image of the information dense PCA features
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=target)
plt.title("Using the 1st and 2nd Dimensions shows increased information")
plt.show()

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

Заключение

В заключение можно сказать, что уменьшение размерности является важнейшим инструментом в науке о данных для борьбы с проклятием размерности. Линейные методы, такие как PCA, факторный анализ, ICA и NMF, полезны, когда данные демонстрируют четкие линейные зависимости и интерпретируемость имеет решающее значение. Однако методы нелинейного уменьшения размерности, такие как Kernel PCA, UMAP и t-SNE, работают, когда данные имеют сложную нелинейную структуру. UMAP, в частности, предлагает несколько преимуществ. Он нелинейен и обладает высокой воспроизводимостью, что делает его отличным выбором для широкого спектра приложений в области обработки данных. Более того, он исключительно эффективен при ускорении с помощью таких библиотек, как RAPIDS, что делает его пригодным для крупномасштабных наборов данных. Вот три сценария, в которых методы уменьшения линейной размерности имеют преимущество:

  1. Разработка функций.Линейные методы легко интерпретируются и могут дать представление о важности функций.
  2. Линейные связи между данными. Когда данные в основном демонстрируют линейные связи, более подходящим является уменьшение линейной размерности.
  3. Эффективность вычислений. Линейные методы обычно работают быстрее и требуют меньше вычислительных ресурсов.

С другой стороны, нелинейные методы снижения размерности предпочтительнее в следующих ситуациях:

  1. Сложные структуры данных. Когда данные содержат сложные нелинейные связи, лучше всего подходят нелинейные методы, такие как UMAP.
  2. Визуализация данных. Для задач визуализации и кластеризации нелинейные методы дают превосходные результаты. Особенно ценным может быть t-SNE, поскольку он хорошо сохраняет локальные структуры.
  3. Воспроизводимость и эффективность: UMAP, благодаря своей нелинейности и эффективности, является отличным выбором для воспроизводимого и масштабируемого уменьшения размерности.

Таким образом, выбор между линейными и нелинейными методами уменьшения размерности зависит от характера ваших данных и ваших конкретных целей. Понимание того, когда и как применять эти методы, является ценным навыком для любого специалиста по данным, ориентирующегося в сложном мире многомерных данных.