Снижение размерности
Снижение размерности в машинном обучении
Введение
Снижение размерности представляет собой совокупность методов, направленных на преобразование многомерного пространства признаков в пространство существенно меньшей размерности при сохранении значимой структуры исходных данных. Такой подход находит широкое применение в задачах визуализации многомерных массивов информации, позволяя идентифицировать группы схожих объектов и выявлять скрытые закономерности.
Актуальность методов снижения размерности обусловлена несколькими факторами. Во-первых, они обеспечивают возможность графического представления многомерных данных в двух- или трёхмерном пространстве, что существенно облегчает интерпретацию результатов анализа. Во-вторых, данные методы способствуют обнаружению кластерной структуры совокупности наблюдений, которая может оставаться незаметной при рассмотрении исходных признаков по отдельности.
В данном примере мы рассмотрим три различных алгоритма:
-
PCA (Principal Component Analysis) — метод главных компонент для линейного проецирования данных;
-
t-SNE (t-distributed Stochastic Neighbor Embedding) — алгоритм нелинейного снижения размерности с сохранением локальных взаимосвязей;
-
UMAP (Uniform Manifold Approximation and Projection) — метод нелинейной проекции, основанный на теории многообразий.
Исходные данные
Присоединим необходимые библиотеки.
#EngeePkg.purge()
import Pkg
Pkg.add(["UMAP", "Makie", "XLSX", "VegaDatasets", "DataFrames", "MultivariateStats", "RDatasets", "StatsBase", "Statistics", "LinearAlgebra", "ScikitLearn", "MLBase", "Distances", "TSne", "PyCall"])
using UMAP, Makie, XLSX, VegaDatasets, DataFrames, MultivariateStats, RDatasets, StatsBase, Statistics, LinearAlgebra, ScikitLearn, MLBase, Distances, TSne, PyCall
Для анализа мы воспользуемся набором данных из пакета VegaDatasets, который включает параметры 406 различных моделей автомобилей.
C = DataFrame(VegaDatasets.dataset("cars"))
Устраним строки с пропущенными данными и отобразим наименования столбцов набора данных.
dropmissing!(C)
M = Matrix(C[:,2:7])
names(C)
Метод главных компонент (PCA)
На первом этапе выполним центрирование данных.
car_origin = C[:,:Origin]
carmap = labelmap(car_origin)
uniqueids = labelencode(carmap,car_origin)
data = M
data = (data .- mean(data,dims = 1))./ std(data,dims=1)
Алгоритм PCA интерпретирует каждый столбец как отдельное наблюдение, поэтому нам потребуется транспонировать исходную матрицу.
data'
Построим модель методом главных компонент. Параметр maxoutdim задаёт итоговую размерность данных, для двумерной визуализации мы устанавливаем его значение равным 2.
p = fit(PCA, data', maxoutdim=2)
Матрицу проекции можно получить с помощью функции projection.
P = projection(p)
Имея матрицу проекции , мы можем применить её к отдельному автомобилю следующим образом:
P'*(data[1,:]-mean(p))
Также можно преобразовать все данные целиком с помощью функции transform.
Yte = MultivariateStats.transform(p, data')
Мы также можем выполнить обратное преобразование из двумерного пространства в исходное шестимерное с помощью функции reconstruct. Однако в этот раз восстановление будет приближённым.
Xr = reconstruct(p, Yte)
Оценим ошибку восстановления данных после обратного преобразования.
norm(Xr-data')
Визуализируем полученные результаты с помощью точечной диаграммы:
p1 = Plots.scatter(Yte[1,car_origin.=="USA"],Yte[2,car_origin.=="USA"],color=1,label="США")
Plots.xlabel!(p1,"Первый признак")
Plots.ylabel!(p1,"Второй признак")
Plots.scatter!(p1,Yte[1,car_origin.=="Japan"],Yte[2,car_origin.=="Japan"],color=2,label="Япония")
Plots.scatter!(p1,Yte[1,car_origin.=="Europe"],Yte[2,car_origin.=="Europe"],color=3,label="Европа")
display(p1)
Визуализация обнаруживает три выраженных кластера.
Обучим модель PCA для проецирования данных в трёхмерное пространство, выполним преобразование и визуализируем результаты на трёхмерном графике.
p = fit(PCA,data',maxoutdim=3)
Yte = MultivariateStats.transform(p, data')
p2 = scatter3d(Yte[1,:],Yte[2,:],Yte[3,:],color=uniqueids,legend=false)
display(p2)
Нелинейное снижение размерности с сохранением локальных взаимосвязей (t-SNE)
Применим алгоритм t-SNE для снижение размерности данных до двух компонент и визуализируем результат на точечной диаграмме.
Y2 = tsne(data, 2, 30, 1000, verbose=false, eta=200.0)
p3 = Plots.scatter(Y2[:,1], Y2[:,2],
color=uniqueids, legend=false, size=(400, 300),
markersize=3, title="t-SNE визуализация")
Plots.xlabel!(p3,"Первый признак")
Plots.ylabel!(p3,"Второй признак")
display(p3)
Здесь наблюдается та же структура данных, хотя сам график выглядит иначе из-за особенностей алгоритма t-SNE.
Метод нелинейной проекции, основанный на теории многообразий (UMAP)
Вычислим корреляционную матрицу признаков и применим UMAP для снижения размерности до двух компонент.
L = cor(data,data,dims=2)
emb = umap(L, 2)
Визуализируем полученные UMAP-проекции на точечном графике.
p4 = Plots.scatter(emb[1,:],emb[2,:],color=uniqueids,legend=false)
Plots.xlabel!(p4,"Первый признак")
Plots.ylabel!(p4,"Второй признак")
display(p4)
Алгоритм UMAP допускает использование альтернативных способов вычисления попарных расстояний между объектами. Рассчитаем евклидовы расстояния между всеми парами наблюдений и применим UMAP к матрице сходства.
L = pairwise(Euclidean(), data, data,dims=1)
emb = umap(-L, 2)
Визуализируем UMAP-проекции на точечном графике.
p5 = Plots.scatter(emb[1,:],emb[2,:],color=uniqueids, legend=false)
Plots.xlabel!(p5,"Первый признак")
Plots.ylabel!(p5,"Второй признак")
display(p5)
Заключение
В данном примере были рассмотрены три метода снижения размерности в применении к набору данных о технических характеристиках автомобилей. Каждый из алгоритмов позволил спроецировать исходное многомерное пространство признаков на плоскость для визуального анализа структуры данных.
Полученные результаты демонстрируют высокую степень согласованности между различными подходами. На всех визуализациях отчётливо наблюдаются три кластера, причём автомобили американского производства образуют два крупных скопления, в то время как японские и европейские модели формируют отдельные смешанные группы.
Данная закономерность свидетельствует о том, что технические характеристики американских автомобилей обладают большей вариативностью и распадаются на несколько различных типов, тогда как японские и европейские модели рассматриваемого периода характеризуются большей однородностью параметров.
Таким образом, снижение размерности выступает эффективным инструментом анализа данных, позволяя выявлять скрытые структуры и взаимосвязи между объектами, недоступные при непосредственном рассмотрении исходных признаков. Согласованность результатов, полученных различными методами, подтверждает устойчивость выявленных паттернов и достоверность сделанных выводов.