/zuzin-laba-5

zuzin-laba-5

Primary LanguageJupyter Notebook

Метод главных компонент

Алгоритм PCA

Дана матрица данных $D$ и коэффициент $\alpha$:

  1. вычисляем среднее значение $\mu = \frac{1}{n} \sum \limits_{i=1}^{n} x_i$;
  2. центруем матрицу данных $Z = D - 1 \cdot \mu^T$;
  3. вычисляем матрицу ковариаций $K = \frac{1}{n} (Z^T Z)$;
  4. вычисляем собственные значения $(\lambda_1, \lambda_2, \ldots, \lambda_d)$;
  5. вычисляем собственные векторы $U = (u_1 u_2 \ldots u_d)$;
  6. вычисляем долю общей дисперсии $f(r) = \frac{\sum_{i=1}^{r} \lambda_i} {\sum_{i=1}^{n} \lambda_i}$;
  7. выбираем наименьший $r$ так, чтобы $f(r) \geq \alpha$;
  8. выбираем $r$ первых векторов $U = (u_1 u_2 \ldots u_r)$;
  9. уменьшаем признаковое пространство: $A = { a_i : | : a_i = U_r^T x_i, : для : i = 1, \ldots, n } $

Реализуйте алгоритм для первых двух главных компонент. Найдите $\lambda_1$, $\lambda_2$ и $u_1$, $u_2$. Спроецируйте данные на плоскость образуемую этими векторами, визуализируйте полученные результаты c метками классов. Сравните реузльтаты с методом PCA из библиотеки sklearn.decomposition.

В качестве данных возьмите изображения с рукописными цифрами.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline

iris = datasets.load_iris()
X = iris.data
Y = iris.target
u = np.mean(X, axis=0)
Z = X - u
covariation = np.cov(Z.transpose())
eigenvalues, eigenvectors = np.linalg.eig(covariation)
eigentuples = [[eigenvalues[i], eigenvectors[i]] for i in range(X.shape[1])]
eigentuples.sort(key=lambda x: x[0], reverse=True)

first_two_tuples = eigentuples[0:2]
first_two_vectors = np.array([first_two_tuples[i][1] for i in range(2)])
two_dimensional = first_two_vectors.dot(X.transpose())

plt.scatter(two_dimensional[0], two_dimensional[1], c = Y)
plt.show()

png

from sklearn import decomposition

pca = decomposition.PCA(n_components=2)
pca.fit(Z)
X_pca = pca.transform(Z)

plt.scatter(X_pca[:,0], X_pca[:,1], c = Y)
plt.show()

png

На основе полученных собственных значений ковариационной матриы $K$ постройте график зависимости покрываемой дисперсии трансформированных данных от количества главных компонент.

coverage = []
coverage_sum = 0
for value, arrow in eigentuples:
    coverage_sum = coverage_sum + value;
    coverage.append(coverage_sum);

plt.scatter([i for i in range(1, len(eigentuples) + 1)], [i / coverage_sum for i in coverage])
plt.show()

png

Интерпретация компонент

Корреляция с исходными признаками

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

Рассчет взаимосвязи будем проводить с помощью корреляции Пирсона:

\begin{equation} r_{jk} = \frac{\sum_{i=1}^n (x_{ij} - \bar{x}j) (x{ik}' - \bar{x}k')}{\sqrt{\sum{i=1}^n (x_{ij} - \bar{x}j)^2 \sum{i=1}^n (x_{ik}' - \bar{x}_k')^2}} \end{equation}

где $\bar{x}_j$ - среднее значение $j$-го признака, $\bar{x}_k'$ - среднее значение проекции на $k$-ю главную компоненту, $n$ - количество объектов.

Отметим, что корреляция Пирсона изменяется от $-1$ до $+1$. Она равна $0$ в случае, когда величины независимы, и $\pm 1$, если они линейно зависимы.

Определите по коэффициентам корреляции, какие признаки в какую компоненту вошли.