Многие методы уменьшения размерности, объясненные на языке Python

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

Представим несколько точек в двумерном пространстве.

У них есть среднее значение, которое где-то находится, и собственные векторы (большой собственный вектор v1 и малый собственный вектор v2). Мы можем представить точки только с координатами v1. Представьте, что все эти точки находятся на синей линии, как далеко они от среднего? Другое измерение v2 не важно. Итак, мы уменьшили размерность (с 2D до 1D).

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

Проклятие размерности

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

Итак, давайте подумаем об этом проще. В табличном наборе данных у нас есть одно измерение для каждого столбца, а всего n измерений в наборе данных с n столбцами. Строки — это точки внутри этого n-мерного пространства. Думайте о ситуации с несколькими рядами и множеством столбцов как о созвездии в галактике. Как указывает Kuss [2002], модели плохо работают, когда речь идет о разреженных данных. Они не могут обобщать модель и подгонять.

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

Обучение происходит за меньшее время. Требуется меньше вычислительных ресурсов.

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

Учтите, что хотя человеческому мозгу трудно понять 4 измерения, будут ситуации, когда вам нужно понять больше. Следовательно, легче понять и визуализировать меньшее количество измерений. Мы можем визуализировать входные данные, которые можно уменьшить до 2-х или 3-х измерений.

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

Естественно, некоторые неважные функции также будут удалены в процессе уменьшения размера. Таким образом, вы избавитесь от признаков, которые не вносят вклад в модель и ведут себя как шум.

Некоторые методы могут преобразовывать нелинейные данные в линейноразложенную форму.

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

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

У нас есть уравнение: a + b + c + d + e = f . Затем мы создаем новую функцию из двух заданных функций, ab = a + b. Тогда новое уравнение будет;

ab + c + d + e = f (это выделение признаков)

Тогда мы знаем, что c и d равны нулю или очень близки к нулю. Итак, мы удаляем их, так как их влияние может быть устранено. c , d ~= 0. В итоге получаем;

ab + e = f (это выбор функции)

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



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

Линейный

Эти методы лучше всего работают с линейными данными. Они могут плохо работать в случаях нелинейных данных.

PCA: анализ основных компонентов

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

PCA пытается провести прямую линию через точки в пространстве, как линию регрессии. Эти линии являются главными компонентами. Количество измерений определяет количество главных компонентов. Задача PCA состоит в том, чтобы ранжировать эти компоненты по степени важности.

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

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

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

В качестве входных данных у нас есть матрица с 4 признаками и 150 наблюдениями (150, 4).

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

Я буду применять StandardScaler от sklearn.

Далее нам нужно вычислить ковариационную матрицу X.

Ковариационная матрица

Ковариационная матрица дает ковариационные пары каждого элемента. Ковариация — это мера зависимости двух переменных друг от друга. Это измерение того, как эти две переменные изменяются вместе. Если ковариация двух переменных (x и y) достаточно высока, в случае изменения они действуют совместно.

Дисперсия рассчитывается как;

Ковариация двух переменных рассчитывается как;

И ковариационная матрица:

Теперь давайте вычислим ковариационную матрицу X.

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



Собственный вектор — это вектор, который не меняет своего направления при соответствующем линейном преобразовании.

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

Я выберу 2 измерения, так как первые 2 собственных значения обеспечивают 95,8% вариабельность.

Наконец, X будет масштабироваться собственными векторами.

Весь код:

Реализация Sklearn

from sklearn.decomposition import PCA
class sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)[source]

Параметры;

n_components: int, float или ‘mle’, по умолчанию = None

Это определяет количество компонентов, которые мы хотим сохранить. Если это None (случай по умолчанию), то;

n_components = min(n_samples, n_features)

Если он находится между 0 и 1, это означает, что мы хотим сохранить n компонентов, что объясняет процент дисперсии.

Если он установлен как ‘mle’, то алгоритм использует для настройки метод Minka’s mle. Это автоматическое угадывание размера.

копировать: bool, по умолчанию=True

Если True, он перезаписывает преобразованные значения поверх заданного X.

отбелить: bool, по умолчанию = False

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

svd_solver: {‘auto’, ‘full’, ‘arpack’, ‘randomized’}, default=’auto’

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

полный: запускает scipy.linalg.svd

arpack: n_components должно быть меньше min(X.shape). запускает scipy.sparse.linalg.svds

рандомизированный: если входные данные больше 500 x 500 и n_components для извлечения меньше 80 % от наименьшего размера, можно применить и предложить рандомизированный. Метод свд Халко.

tol: плавающая, по умолчанию = 0,0

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

iterated_power:целое число или «авто», по умолчанию = «авто»

Если решатель является «рандомизированным», то можно определить количество итераций для степенного метода.

Мы можем получить объясненные проценты дисперсии;

pca.explained_variance_ratio_
#[0.72962445 0.22850762]

Теперь давайте применим PCA к набору данных о раке молочной железы.

pca.explained_variance_ratio_
#array([0.44272026, 0.18971182])

В конце концов, мы сократили матрицу из 30 признаков до двух измерений, а два измерения объясняют 63% дисперсии.

ФА: Факторный анализ

Это еще один метод сокращения, он пытается найти скрытые переменные в наборе данных через взаимосвязь переменных друг с другом. Мы называем эти скрытые переменные факторами.

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

Приведем простой пример. Например, у нас есть две переменные: мощность процессора и потребление электроэнергии. Между этими двумя переменными будет высокая корреляция, потому что по мере увеличения мощности ЦП будет увеличиваться и количество потребляемой им электроэнергии. Затем мы помещаем эти две переменные в одну группу. Мы называем эту группу фактором. По мере того, как мы перемещаемся по функциям в наборе данных, мы уменьшаем размер, потому что групп (факторов) будет меньше, чем функций.

Чтобы продемонстрировать FA, я буду использовать набор данных BFI. Его можно скачать здесь. Этот набор данных представляет собой проект по оценке личности. После очистки набора данных это выглядит так:

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

Тест Бартлетта проверяет, связаны ли функции друг с другом. При этом он сравнивает корреляционную матрицу с единичной матрицей.

P-значение равно 0, что указывает на то, что матрица корреляции не является единичной матрицей. Он прошел испытание.

В критерии Кайзера-Мейера-Олкина учитываются различия между признаками. KMO контролирует коэффициенты отклонения. Тест дает результаты от 0 до 1. Чем выше результат, тем лучше для факторного анализа (практический предел хороших результатов составляет 0,6).

0,84 - хороший результат.

Для определения числа факторов воспользуемся собственными значениями. Практически мы можем установить предел значения равным 1.

Давайте нанесем значения;

Мы можем выбрать 6 факторов, так как только 6 собственных значений больше единицы.

Параметр вращения является аргументом для облегчения интерпретации анализа.

Факторные нагрузки показывают взаимосвязь каждого исходного признака с факторами. Высокий лучше. Как видите, все значения 6-го фактора низкие. На самом деле 6-й фактор не нужен. Лучше начать заново с 5 факторами.

Факторами объясняется 45% процентов общей дисперсии.

Весь код для этой демонстрации;

LDA: линейный дискриминантный анализ

LDA можно использовать как мультиклассификационную модель, а также для уменьшения размерности. Это контролируемый метод (в отличие от PCA), поэтому он использует метки классов.

Для правильной работы LDA данные должны иметь нормальное распределение. Масштабирование не требуется. Классы должны существовать. Максимальный компонент может быть на единицу меньше, чем общее количество классов в целевом объекте.

Теперь у нас есть два класса, как показано ниже.

Предположим, что мы спроецировали эти точки на ось x. Как вы можете заметить, это не работает таким образом. Много информации теряется.

Вместо этого давайте проведем линейную линию (как регрессию) между точками в соответствии с x и y. Затем спроецируем эти точки на эту линию.

Теперь лучше! Объясняет многое.

Таким образом, эти линейные комбинации (дискриминантные функции) создаются n входными признаками. Признаки проецируются на эти линейные дискриминанты. Имейте в виду, что эти линейные дискриминанты предполагают, что классы целевых признаков имеют многомерное нормальное распределение с одинаковой дисперсией.

Давайте создадим данные фиктивной классификации, чтобы продемонстрировать LDA.

from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=10,   n_informative=5, n_redundant=2, random_state=1, n_classes=4)

Более 85% дисперсии объясняется двумя компонентами. Вы можете увидеть классы в таблице ниже с 2 компонентами.

ICA: анализ независимых компонентов

ICA — это метод, основанный на теории информации. В отличие от PCA, он ищет факторы, которые не зависят друг от друга, а не факторы, которые не коррелируют. Позвольте мне объяснить эту разницу следующим образом; Если мы говорим, что две переменные не коррелируют друг с другом, мы указываем, что между ними нет линейной зависимости. Если мы говорим, что эти две переменные независимы, мы говорим, что они ни в каком смысле не зависят друг от друга.

ICA считает, что среди исходных переменных есть некоторые латентные смешанные переменные, и эти латентные переменные должны быть независимы друг от друга. Это максимизирует негауссовость компонентов ICA за счет разделения информации.

Мы снова можем использовать набор данных по раку молочной железы.

Матричная факторизация

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

Разложенная матрица состоит из составных частей сложной матрицы. Приведу пример для упрощения. Мы можем сказать 2 x 5 как коэффициент 10. Как и при умножении на 10, мы проходим через аналогичный процесс с матрицами.

Разложение матрицы LU

Этот метод разлагает матрицу на две составляющие; L и U. A — квадратная матрица, которую мы хотим разложить, а L и U — треугольные матрицы.

A = L . U

Более стабильной версией разложения LU является разложение LUP, когда в уравнение вводится новая матрица P. Родительская матрица переупорядочивается, чтобы обеспечить более надежное решение, и именно здесь нам нужна матрица P.

A = P . L . U

import numpy as np
from scipy.linalg import lu
#let's define a square matrix 3x3
arr = np.array([[1,1,1],[2,2,2],[3,3,3]])
#we will use lu method to get decomposed matrixes
P, L, U = lu(arr)
#P
[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]
#L -> lower triangle
[[1.         0.         0.        ]
 [0.66666667 1.         0.        ]
 [0.33333333 0.         1.        ]]
#U -> upper triangle
[[3. 3. 3.]
 [0. 0. 0.]
 [0. 0. 0.]]

Разложение QR-матрицы

Если матрица не квадратная, можно использовать декомпозицию QR-матрицы. Он применяется к m x n матрицам.

A = Q . R

Q представляет собой квадратную матрицу размера m x m, а R представляет собой матрицу верхнего треугольника формы m x n.

from numpy.linalg import qr
Q, R = qr(arr, "complete")
#Q
[[-0.26726124  0.95618289  0.11952286]
 [-0.53452248 -0.04390192 -0.84401323]
 [-0.80178373 -0.28945968  0.52283453]]
#R 
[[-3.74165739e+00 -3.74165739e+00 -3.74165739e+00]
 [ 0.00000000e+00 -4.96506831e-16 -4.96506831e-16]
 [ 0.00000000e+00  0.00000000e+00  4.93038066e-32]]

Разложение Холецкого

Мы можем применить этот метод к квадратным симметричным матрицам, и все собственные значения должны быть положительными. Мы разлагаем матрицу A на матрицу нижнего треугольника и транспонируем L. Мы также можем разложить ее, используя верхний треугольник.

A = L . L^T or A = U^T . U

from numpy.linalg import cholesky
#a new matrix that is positive
arr = np.array([[3,1,1],[2,4,2],[3,3,6]])
L = cholesky(arr)
#L
[[1.73205081 0.         0.        ]
 [1.15470054 1.63299316 0.        ]
 [1.73205081 0.61237244 1.62018517]]

SVD: разложение по сингулярным значениям

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

Матрица A разлагается на U-ортогональную матрицу, S-диагональную матрицу и V-другую диагональную матрицу.

NMF: неотрицательная матричная факторизация

Это неконтролируемый алгоритм обучения. Здесь входная матрица должна быть неотрицательной матрицей. Эта входная матрица разбивается на две неотрицательные матрицы W и H.

A = W . H

Этот метод обеспечивает сжатие данных. Он устойчив к шуму и легко интерпретируется.

from sklearn.decomposition import NMF 
model = NMF(n_components=200, init='nndsvd', random_state=0) 
W = model.fit_transform(X) 

Нелинейное (многообразное обучение)

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

Многообразие

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

Точно так же рассмотрим n-мерную кривую. Когда мы сложим все многообразия на этой кривой, мы все равно получим исходную n-мерную кривую.

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

Ядро PCA

Как видно из названия метода, этот метод подобен методу PCA, используемому для нелинейных случаев. Он использует «трюк ядра».

Данные сначала проецируются в пространство более высокого измерения с помощью ядер. Таким образом, классы становятся более разделимыми. Затем к этим новым многомерным данным применяется классический PCA, и данные сводятся обратно к низкоразмерному пространству.

Функция ядра вычисляет скалярное произведение для нелинейного отображения данных. По сути, здесь имеется в виду следующее: нелинейные комбинации исходных признаков создаются и усиливаются из исходного измерения в пространство более высокого измерения. Например, у нас есть три функции x1, x2 и x3:

Мы применяем ядро ​​к этим функциям, и тогда мы получаем что-то в более высоком измерении.

Чтобы визуализировать это, давайте сначала создадим фиктивные данные кластеризации.

from sklearn.datasets import make_circles
X, y = make_circles(n_samples=1000, factor=.2, noise=.1)

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

kpca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=10, )
X_kpca = kpca.fit_transform(X)

Хороший! Теперь мы можем разделить их линейной линией.

from sklearn.decomposition import KernelPCA
class sklearn.decomposition.KernelPCA(n_components=None, *, kernel='linear', gamma=None, degree=3, coef0=1, kernel_params=None, alpha=1.0, fit_inverse_transform=False, eigen_solver='auto', tol=0, max_iter=None, iterated_power='auto', remove_zero_eig=False, random_state=None, copy_X=True, n_jobs=None)[source]

Параметры;

n_components:int, default=None

Если выбрано значение «Нет», сохраняются все ненулевые компоненты.

kernel: {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘cosine’, ‘precomputed’}, default=’linear’

Это тип ядра для PCA. rbf используется чаще всего.

гамма: плавающая, по умолчанию = нет

Это коэффициент ядра (если ядро ​​является одним из rbf, поли или сигмовидным).

градус: целое, по умолчанию=3

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

coef0: плавающая, по умолчанию = 1

Если ядро ​​сигмовидное или полиамидное, мы можем передать независимое значение терма.

kernel_params:dict, по умолчанию = нет

Мы можем передавать аргументы в виде словаря.

альфа: плавающая, по умолчанию = 1,0

Если значение fit_inverse_transform равно true, можно задать значение гиперпараметра для гребневой регрессии.

eigen_solver: {‘auto’, ‘dense’, ‘arpack’, ‘randomized’}, default=’auto’

Собственный решатель. Если количество компонентов меньше количества обучающих выборок, предлагается рандомизированный или arpack.

tol: с плавающей запятой, по умолчанию=0

Допуск сходимости, если собственный решатель arpack.

max_iter: целое число, по умолчанию=нет

Это максимальное число итераций для собственного решателя arpack.

itered_power: int ≥ 0 или «авто», по умолчанию = «авто»

Это количество итераций, если решатель svd выбран как рандомизированный.

remove_zero_eig: bool, по умолчанию = False

Если он установлен как истина, то все нулевые собственные значения удаляются.

t-SNE: t-распределенное стохастическое встраивание соседей

Это контролируемый метод, который используется в области НЛП и обработки изображений, а также помогает в визуализации данных. Перед применением t-SNE рекомендуется использовать PCA или TSVD.

Помните, что PCA пытался максимизировать дисперсию, в отличие от этого, t-SNE пытается минимизировать расхождение между двумя распределениями.

Расхождение

Хотя предмет не сложный, иногда его может быть трудно понять, потому что математика является абстрактным понятием, и эти понятия также очень необычны. Прохождение курса векторного исчисления также облегчит понимание этого предмета.

Если мы рассмотрим конкретную концепцию, давайте подумаем о реке. В каждой точке реки вода имеет определенное значение скорости, и соответственно в единицу времени имеется определенный расход воды. Если мы хотим выразить это как вектор, нам нужно представить эту реку как поверхность или объект, состоящий из стрелок. Это то, что называется векторным полем. Чтобы показать это, требуется уравнение, определяющее расход воды в желаемой точке реки. Создание этого уравнения выполняется с использованием различных измерений и наиболее подходящей модели уравнения (порядок какой степени и т. д.).

Сгенерированное уравнение является векторной функцией в виде ai+bj+ck. Эта функция дает информацию о том, сколько воды проходит в каком направлении. Теперь мы можем использовать эту функцию, а именно векторное поле, для нужных нам целей. Например, мы можем узнать скорость потока в нужной нам точке.

Или, скажем, мы хотим узнать, есть ли изменение точечного потока или нет. Точно так же, как мы используем производную для нахождения единичного изменения функции, мы также берем производную для i, j и k отдельно в зависимости от x, y и z и записываем координаты этой области на месте. Три значения, которые у нас есть, дают увеличение или уменьшение вектора в этой точке в каждом направлении. То есть, если есть увеличение количества воды, проходящей в единицу времени, оно положительно, если есть уменьшение, то оно отрицательно, в противном случае, оно равно нулю. Когда мы складываем эти три значения, мы понимаем, увеличилось ли значение вектора в этой точке в сумме.

Если результат положительный: есть прибавка. Значит, либо сужение, либо была произведена подпитка.
Если результат отрицательный: есть уменьшение. Обычно, если в минуту проходит 10 кг воды, становится 3 кг. Либо река расширилась, либо вода берется из этой части.

Подводя итог, можно сказать, что дивергенция используется для определения того, увеличилось ли значение векторного поля в какой-либо точке.

KL — расхождение

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

KL Divergence — это математический метод вычисления этой оценки расхождения.

KL(P || Q) = — сумма x в X P(x) * log(Q(x) / P(x))

Теперь вернемся к теме t-SNE. Этот метод сначала вычисляет распределение вероятностей для многомерных данных. Затем он создает аналогичные копии этих распределений в более низких измерениях. Наконец, это сводит к минимуму расхождение между этими двумя распределениями.

Чтобы продемонстрировать t-SNE, мы можем использовать данные MNIST.

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

Очевидно, что в нелинейных случаях лучше использовать t-SNE вместо PCA. Однако, если мы говорим о больших объемах данных, стоимость вычислений будет высокой.

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

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

Сначала измеряется расстояние между точками в многомерном пространстве. Затем они проецируются в пространство более низкого измерения, и расстояние снова измеряется в пространстве более низкого измерения. Используя SGD (стохастический градиентный спуск), различия между этими расстояниями пытаются свести к минимуму.

import umap
X_umap = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(X)

LLE: локально линейное вложение

Еще один неконтролируемый нелинейный метод. Он использует топологию данных и хранит их в низкоразмерном пространстве. Это быстрый метод, но он не работает, если данные содержат шум.

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

MDS: многомерное масштабирование

Мы можем применять как метрические, так и неметрические методы многомерного шкалирования.

Спектральное вложение

Нелинейный, неконтролируемый. Этот метод ищет кластеры в разных группах среди их представлений в низкоразмерном пространстве.

Вычисляется матрица Лапласа данных. Собственные вещи получаются из разложения. Этот метод использует второе наименьшее собственное значение и его вектор.

Этот метод используется в проектах сегментации изображений.

Isomap: изометрическое картографирование

Метод Isomap предполагает, что многообразия плоские. Следовательно, и геодезическое, и евклидово расстояния равны.

Автоэнкодер

Автокодировщики — это разновидность ИНС. Это тема другой подробной статьи. Однако мы должны знать, что автоэнкодеры также используются для операций уменьшения размерности.

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

Заключение

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

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

Надеюсь, этот каталог будет вам полезен.

Читать далее…











Рекомендации

https://en.wikipedia.org/wiki/Dimensionality_reduction

https://machinelearningmastery.com/dimensionity-reduction-for-machine-learning/

https://machinelearningmastery.com/introduction-to-matrix-decompositions-for-machine-learning/

https://medium.com/data-science-365/statistical-and-mathematical-concepts-behind-pca-a2cb25940cd4

https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

https://towardsdatascience.com/principal-component-analysis-pca-with-scikit-learn-1e84a0c731b0

https://towardsdatascience.com/factor-analysis-on-women-track-records-data-with-r-and-python-6731a73cd2e0

https://towardsdatascience.com/11-diversity-reduction-techniques-you-should-know-in-2021-dcb9500d388b

https://www.youtube.com/watch?v=3uxOyk-SczU

https://www.youtube.com/watch?v=AU_hBML2H1c

https://www.youtube.com/watch?v=jPmV3j1dAv4

https://machinelearningmastery.com/divergence-between-probability-distributions/

https://eksisozluk.com/entry/73389025

https://neptune.ai/blog/dimensionity-reduction

https://www.geeksforgeeks.org/diversity-reduction/

https://www.javatpoint.com/dimensionity-reduction-technique

https://thenewstack.io/3-new-techniques-for-data-digitality-reduction-in-machine-learning/

https://www.analyticsvidhya.com/blog/2018/08/dimensionity-reduction-techniques-python/

https://scikit-learn.org/stable/modules/unsupervised_reduction.html

https://www.tmwr.org/Dimensionity.html

https://www.datacamp.com/tutorial/introduction-factor-analysis