Анализ главных компонент
Анализ главных компонент (PCA) – это подход, используемый для уменьшения размерности, который улучшает визуализацию данных, сохраняя при этом максимум информации исходных данных. Потеря информации исследуется по дисперсии между исходными данными и сжатыми (спроецированными) данными, целью которой является максимизация дисперсии.
В машинном обучении РСА влияет на скорость алгоритма обучения, который уменьшает набор признаков высокой размерности (например, 10 000) до более низкой (например, 1 000). Таким образом, РСА позволяет алгоритму работать быстрее.
Алгоритм
Перед началом работы алгоритма PCA требуется предварительная обработка. Целью предварительной обработки является нормализация каждого признака данных, при которой каждый признак в наборе данных будет иметь нулевое среднее и единичную дисперсию. Код показан ниже:
def featureNormalize(X):
mu = np.mean(X, axis=0) # Mean of each feature
sigma = np.std(X, axis=0) # Standard deviation of each feature
X_norm = (X-mu)/sigma # Normalized data (zero mean and unite standard deviation)
return X_norm
Чтобы уменьшить данные с n-размеров до k-размеров (эквивалентно количеству компонентов), сначала вычисляется ковариационная матрица, обозначаемая ∑ следующим образом:
Где X – n-мерные данные, m – количество примеров, а ∑ – ковариационная матрица размером n x n.
Далее вычисляются собственные векторы ковариационной матрицы через разложение по сингулярным значениям или SVD, в результате чего получается унитарная матрица U и вектор с сингулярными значениями S. Выбрав k первых столбцов матрицы U, получаем новую матрицу Ur, которая используется для получения уменьшенных данных Z k-размерности, как показано в уравнении ниже:
Код Python для выполнения PCA показан ниже:
def pca(X, k):
m = np.size(X, axis=0) # Number of examples
sigma = (1/m)*X.T.dot(X) # Covariance Matrix
[U, S, V] = np.linalg.svd(sigma) # Singular Decomposition Value
Ur = U[:, 0:k] # U reduce
Z = X.dot(Ur) # Projected data of k-dimensions
return Z, S
Исходные данные X и число компонент k являются входами функции, а спроецированные данные Z и вектор сингулярных значений являются выходами функции.
Выбор числа главных компонент
Суть PCA заключается в выборе числа компонентов k, которое исследуется с помощью кумулятивного объясненного дисперсионного отношения, оценивая которое мы можем сохранить информацию исходных данных. Коэффициент дисперсии получается из вектора сингулярных значений S, как показано в приведенном ниже уравнении:
Где k – количество компонентов (k-размеров), а n – количество признаков. Выбор k осуществляется путем отбора наименьших значений k, у которых коэффициент дисперсии выше определенного порога, например, 99%. Код для расчета кумулятивного объясненного коэффициента дисперсии показан ниже:
def cumulativeExplainedVariance(S, k_range):
variance_ratio = np.zeros(k_range) # Cumulative explained variance ratio
for i in range(k_range):
variance_ratio[i] = np.sum(S[0:i+1])/np.sum(S)
return variance_ratio
Входными данными функции являются вектор сингулярных значений S и диапазон исследуемых компонент k. Выходными данными является вектор кумулятивных объясненных коэффициентов дисперсии.
Набор данных по радужной оболочке глаза
Набор данных радужной оболочки глаза используется для анализа выбора количества компонентов в PCA. Краткое описание набора данных и его особенностей приведено в предыдущей статье блога о дискриминанте Фишера.
Исследуя набор данных радужной оболочки глаза для значений k в диапазоне 1-3, мы получаем график числа компонент по кумулятивному коэффициенту объясненной дисперсии, представленный ниже:
Видно, что k = 3 является наименьшим значением k с кумулятивным объясненным коэффициентом дисперсии 0,9948, что выше порогового значения 0,99 (красная пунктирная линия). Таким образом, k = 3 – это наименьшее значение, которое максимизирует дисперсию между исходными данными и спроецированными данными. На рисунке ниже показана трехмерная диаграмма рассеяния спроецированных данных из данных о радужной оболочке глаза с k = 3.
Анализ питательных веществ набора данных пиццы
Теперь исследуется анализ питательных веществ набора данных пиццы. Набор данных доступен на Kaggle и содержит 300 примеров и 7 признаков, распределенных по 10 классам. Некоторые признаки – это количество воды и белка на 100 грамм в образце.
Исследуя питательные вещества набора данных пиццы для значений k в диапазоне 1-6, мы получаем график числа компонент по кумулятивному коэффициенту объясненной дисперсии, представленный ниже:
Проверяя график выше, можно заметить, что k = 4 является наименьшим значением k с кумулятивным объясненным отношением дисперсии 0,9960, что выше порога 0,99 (красная пунктирная линия). Таким образом, k = 4 – это наименьшее значение, которое максимизирует дисперсию между исходными данными и спроецированными данными. На рисунке ниже показан график признака 1 и признака 2 спроецированных данных от питательных веществ пиццы при k = 4.
Вывод
Таким образом, оценка кумулятивного коэффициента объясненной дисперсии является надежным методом выбора количества компонент на PCA, который выполняет снижение размерности, максимизируя дисперсию между исходными и спроецированными данными.
Полный код доступен на Github и Colab. Следите за блогом, если эта статья будет для вас полезной.
Если вас интересует снижение размерности с помощью линейного дискриминанта Фишера, я написал об этом статью в блоге. Если вы хотите ознакомиться с ним: blog post.