Рубрики
Без рубрики

Главный компонентный анализ с нуля в Python

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

Автор оригинала: Pankaj Kumar.

Главный компонентный анализ с нуля в Python

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

Это было около 1901 года и по-прежнему использовалось в качестве преобладающего метода снижения измерений в машинном обучении и статистике. PCA является неповторимым статистическим методом.

В этой статье у нас будет некоторая интуиция о PCA и будет реализовать ее с нуля с помощью Python и Numpy.

Зачем использовать PCA в первую очередь?

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

Предположим, у нас есть набор данных имеющие две переменные и 10 точек данных. Если нас попросили визуализировать точки данных, мы можем сделать это очень легко. Результат также очень интерпретируется.

Х1. 2 8 1 4 22 15 25 29 4 2
Х2. 3 6 2 6 18 16 20 23 6 4
Построение данных по двум измерениям

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

Эта проблема, с которой мы сталкиваемся при анализе данных более высокого размера, это то, что обычно называют « проклятие размерности ». Этот термин был впервые придуман Ричардом Э. Беллман.

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

Реализация PCA с Python

Чтобы понять максимальную интуицию от содержимого, приведенного ниже, мы предполагаем, что вы должны немного знать о линейной алгебре и Матрицы Отказ Если нет, то мы очень поощряем вас смотреть Линейная алгебрария серии 3blue1Brown На YouTube Grant Sanderson, чтобы получить переподготовку концепций, как оно окажется очень полезным в вашем автобусном путешествии.

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

Установка эллипса к данным

Шаги для реализации PCA в Python

#Importing required libraries
import numpy as np

1. Вычтите среднее значение каждой переменной

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

#Generate a dummy dataset.
X = np.random.randint(10,50,100).reshape(20,5) 
# mean Centering the data  
X_meaned = X - np.mean(X , axis = 0)

Данные, сгенерированные вышеуказанным кодом, имеют размеры (20,5) I.E. 20 примеров и 5 переменных для каждого примера. Мы рассчитали среднее значение каждой переменной и вычитали, что из каждой строки соответствующей колонки.

2. Рассчитайте ковариационную матрицу

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

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

Вот почему диагональные элементы ковариационной матрицы являются просто дисперсией элементов.

# calculating the covariance matrix of the mean-centered data.
cov_mat = np.cov(X_meaned , rowvar = False)

Мы можем легко рассмотреть ковариационную матрицу, используя numpy.cov () метод. Значение по умолчанию для Rowvar установлен на Правда , не забудьте установить его на Ложь Чтобы получить ковариационную матрицу в нужных размерах.

3. Вычислить собственные значения и собственные векторы

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

Более высокое собственное значение соответствует более высокой изменчивости. Следовательно, основная ось с более высоким собственным значением будет оси, захватывая более высокую изменчивость данных.

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

#Calculating Eigenvalues and Eigenvectors of the covariance matrix
eigen_values , eigen_vectors = np.linalg.eigh(cov_mat)

Numpy lineg.eigh () Способ возвращает собственные значения и собственные векторы сложной эгистрации или настоящей симметричной матрицы.

4. Сортировка собственных значений в порядке убывания

Сортируйте собственные значения в поручении убывания вместе со своим соответствующим собственным вектором.

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

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

#sort the eigenvalues in descending order
sorted_index = np.argsort(eigen_values)[::-1]

sorted_eigenvalue = eigen_values[sorted_index]
#similarly sort the eigenvectors 
sorted_eigenvectors = eigen_vectors[:,sorted_index]

np.argsort Возвращает массив индексов такой же формы.

5. Выберите подмножество из переставленной матрицы собственного значения

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

# select the first n eigenvectors, n is desired dimension
# of our final reduced data.

n_components = 2 #you can select any number of components.
eigenvector_subset = sorted_eigenvectors[:,0:n_components]

N_Components означает, что наши окончательные данные должны быть уменьшены до 2 переменных. Если мы изменим его до 3, мы получаем наши данные, сниженные до 3 переменных.

6. Превратите данные

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

#Transform the data 
X_reduced = np.dot(eigenvector_subset.transpose(),X_meaned.transpose()).transpose()

Окончательные размеры X_REDEC будут (20, 2) и первоначально данные имели более высокие размеры (20, 5).

Теперь мы можем визуализировать наши данные с доступными инструментами, которые у нас есть. Ура! Миссия выполнена.

Полный код для основного компонентного анализа в Python

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

import numpy as np

def PCA(X , num_components):
    
    #Step-1
    X_meaned = X - np.mean(X , axis = 0)
    
    #Step-2
    cov_mat = np.cov(X_meaned , rowvar = False)
    
    #Step-3
    eigen_values , eigen_vectors = np.linalg.eigh(cov_mat)
    
    #Step-4
    sorted_index = np.argsort(eigen_values)[::-1]
    sorted_eigenvalue = eigen_values[sorted_index]
    sorted_eigenvectors = eigen_vectors[:,sorted_index]
    
    #Step-5
    eigenvector_subset = sorted_eigenvectors[:,0:num_components]
    
    #Step-6
    X_reduced = np.dot(eigenvector_subset.transpose() , X_meaned.transpose() ).transpose()
    
    return X_reduced

Мы определили функцию имени PCA, принимая матрицу данных и количество компонентов в качестве входных аргументов.

Мы будем использовать DataSet Iris и применить нашу функцию PCA к нему.

import pandas as pd

#Get the IRIS dataset
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
data = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])

#prepare the data
x = data.iloc[:,0:4]

#prepare the target
target = data.iloc[:,4]

#Applying it to PCA function
mat_reduced = PCA(x , 2)

#Creating a Pandas DataFrame of reduced Dataset
principal_df = pd.DataFrame(mat_reduced , columns = ['PC1','PC2'])

#Concat it with target variable to create a complete Dataset
principal_df = pd.concat([principal_df , pd.DataFrame(target)] , axis = 1)

Важный совет: Мы должны стандартизировать данные Везде, где это необходимо до применения любого алгоритма ML. В приведенном выше коде мы не стандартизировали наши данные, но мы сделали это при внедрении PCA.

Давайте построим наши результаты, используя библиотеки Meanborn и Matplotlib.

import seaborn as sb
import matplotlib.pyplot as plt

plt.figure(figsize = (6,6))
sb.scatterplot(data = principal_df , x = 'PC1',y = 'PC2' , hue = 'target' , s = 60 , palette= 'icefire')
Уменьшенный размер размерности

Это оно! Это работало прекрасно.

Заключение

В этой статье мы узнали о PCA, как PCA работает и реализован PCA, используя Numpy. Счастливое обучение!