Собственные значения ковариационной матрицы с использованием QR-факторизации - PullRequest
1 голос
/ 12 марта 2019

Учитывая матрицу X размерности D x N, мне интересно вычислить собственные значения C = np.dot(X, X.T)/N с использованием QR-факторизации. На основании следующего:

enter image description here

мы ожидаем, что собственные значения C будут np.diag(r.T,r) с использованием следующего

q, r=np.linalg.qr(np.dot(X.T, V))
lambdas2=np.diag(np.dot(r.T, r)) / N

Однако значения в lambdas2, которые я принимаю с использованием приведенного ниже кода, отличаются от значений в lambda1.

from sklearn.decomposition import PCA
pca = PCA()
pca.fit(X)
lambdas1=pca.explained_variance_

Полный пример:

import numpy as np
from sklearn.decomposition import PCA
if __name__ == "__main__":
    N = 1000
    D = 20
    X = np.random.rand(D, N)

    X_train_mean = X.mean(axis=0)
    X_train_std = X.std(axis=0)
    X_normalized = (X - X_train_mean) / X_train_std

    pca = PCA(n_components=D)
    cov_ = np.cov(X_normalized) # A D x D array.
    pca.fit(cov_)
    lambdas1 = pca.explained_variance_

    projected_data = np.dot(pca.components_, X_normalized).T # An N x n_components array.

    q, r = np.linalg.qr(projected_data)
    lambdas2 = np.sort(np.diag(np.dot(r.T, r)) / N)[::-1]

1 Ответ

1 голос
/ 13 марта 2019

Полагаю, вам нужно передать X_normalized.T в метод подгонки PCA, а не ковариационную матрицу.

Поскольку вычисление ковариационной матрицы является частью алгоритма PCA иcomponents / explained_variance являются непосредственно собственными векторами / собственными значениями ковариационной матрицы.

...