Дана матрица данных
- вычисляем среднее значение
$\mu = \frac{1}{n} \sum \limits_{i=1}^{n} x_i$ ; - центруем матрицу данных
$Z = D - 1 \cdot \mu^T$ ; - вычисляем матрицу ковариаций
$K = \frac{1}{n} (Z^T Z)$ ; - вычисляем собственные значения
$(\lambda_1, \lambda_2, \ldots, \lambda_d)$ ; - вычисляем собственные векторы
$U = (u_1 u_2 \ldots u_d)$ ; - вычисляем долю общей дисперсии
$f(r) = \frac{\sum_{i=1}^{r} \lambda_i} {\sum_{i=1}^{n} \lambda_i}$ ; - выбираем наименьший
$r$ так, чтобы$f(r) \geq \alpha$ ; - выбираем
$r$ первых векторов$U = (u_1 u_2 \ldots u_r)$ ; - уменьшаем признаковое пространство:
$A = { a_i : | : a_i = U_r^T x_i, : для : i = 1, \ldots, n } $
Реализуйте алгоритм для первых двух главных компонент. Найдите
В качестве данных возьмите изображения с рукописными цифрами.
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()
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()
На основе полученных собственных значений ковариационной матриы
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()
Главные компоненты являются линейными кобинациями исходных признаков. В этой связи необходимо оценить связь каждой компоненты с исходными признаками.
Рассчет взаимосвязи будем проводить с помощью корреляции Пирсона:
\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}
где
Отметим, что корреляция Пирсона изменяется от
Определите по коэффициентам корреляции, какие признаки в какую компоненту вошли.