statsmodels PCA сумма собственных значений - PullRequest
1 голос
/ 22 апреля 2020

Когда я применяю statsmodels.multivariate.pca.PCA к некоторым данным, я обнаруживаю, что сумма полученных собственных значений не равна общей дисперсии данных. Я использую следующий код

import numpy as np
import statsmodels.api as sm

corr_matrix = np.array([
    [1, 0.8, 0.4],
    [0.8, 1, 0.6],
    [0.4, 0.6, 1]])

Z = np.random.multivariate_normal([0,0,0], corr, 1000)

pc = sm.PCA(Z, standardize=False, demean=False, normalize=False)

pc.eigenvals.sum()

, и результат (в данной случайной выборке) равен 2994.51488403581, в то время как я ожидал, что это добавит к 3.

Чего мне не хватает?

Добавить 1

Кажется, что когда PCA выполняется на данных X (то есть с использованием матрицы X^TX), связь между суммой дисперсий и собственными значениями больше не сохраняется, и только когда PCA выполняется на ковариационной матрице (то есть на X^TX/n), когда сумма собственных значений равна сумме дисперсий, то есть trace(X^TX/n) = sum(eigenvalues). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 109

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

быстрый ответ с помощью обратного инжиниринга (я не помню деталей)

pc = PCA(Z, standardize=False, demean=True, normalize=False)
​
pc.eigenvals.sum() / 1000
2.7550787264061087

Z.var(0).sum()
2.7550787264061087

При расчете дисперсии данные унижаются. Если мы не унижаемся, тогда мы получаем только центрированный квадратичный c продукт.

pc = PCA(Z, standardize=False, demean=False, normalize=False)
​
pc.eigenvals.sum(), pc.eigenvals.sum() / Z.shape[0]
(2756.1915877060546, 2.7561915877060548)

(Z**2).mean(0).sum()
2.7561915877060548
1 голос
/ 22 апреля 2020

Собственные значения не являются дисперсией данных. Собственные значения - это дисперсия данных в заданном c направлении, определяемом собственными векторами. Дисперсия данных является суммой расстояния всех точек до среднего значения данных. P C являются характеристиками c данных и показывают, как данные расширяются в пространстве в определенных c направлениях. Не следует путать дисперсию данных с собственным значением (которое показывает дисперсию в направлении собственного вектора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...