Вы разложили неправильную матрицу.
Анализ главных компонентов требует манипулирования собственными векторами / собственными значениями
ковариационная матрица , а не сами данные. Ковариационная матрица, созданная из матрицы данных m x n, будет представлять собой матрицу m x m с единицами по главной диагонали.
Вы действительно можете использовать функцию cov , но вам нужны дальнейшие манипуляции с вашими данными. Возможно, немного проще использовать подобную функцию: corrcoef :
import numpy as NP
import numpy.linalg as LA
# a simulated data set with 8 data points, each point having five features
data = NP.random.randint(0, 10, 40).reshape(8, 5)
# usually a good idea to mean center your data first:
data -= NP.mean(data, axis=0)
# calculate the covariance matrix
C = NP.corrcoef(data, rowvar=0)
# returns an m x m matrix, or here a 5 x 5 matrix)
# now get the eigenvalues/eigenvectors of C:
eval, evec = LA.eig(C)
Чтобы получить собственные векторы / собственные значения, я не разлагал ковариационную матрицу с использованием SVD,
хотя, конечно, вы можете. Я предпочитаю рассчитывать их, используя eig в NumPy (или SciPy)
Модуль LA - с ним немного легче работать, чем с svd , возвращаемые значения - собственные векторы
и собственные значения, и ничего больше. В отличие от этого, как вы знаете, svd не возвращает их напрямую.
Конечно, функция SVD будет разлагать любую матрицу, а не только квадратную (которой ограничена функция eig ); однако при выполнении PCA у вас всегда будет квадратная матрица для разложения,
независимо от формы, в которой находятся ваши данные. Это очевидно, потому что матрица
разлагаются в PCA это ковариационная матрица , которая по определению всегда квадратная
(то есть столбцы являются отдельными точками данных исходной матрицы, аналогично
для строк, и каждая ячейка является ковариацией этих двух точек, как свидетельствует
на единицу по главной диагонали - данная точка данных имеет идеальную ковариацию с самим собой).