Вот пример:
import numpy as np
from scipy.linalg import svd
from sklearn.preprocessing import StandardScaler
X_train = np.asarray([[13.71,1.86,2.36,16.6],[12.22,1.29,1.94,19],
[13.27,4.28,2.26,20],[13.16,3.57,2.15,21],
[13.86,1.51,2.67,25]])
#PCA
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
cov_mat = np.cov(X_train_std.T)
eigen_vals, eigen_vecs = np.linalg.eigh(cov_mat)
eigen_vals = np.asarray(sorted(eigen_vals, reverse=True))
#SVD
U,eigen_vals_S,V = svd(X_train)
eigen_vals_S2 = (eigen_vals_S**2)
print('\nEigenvalues \n%s' % eigen_vals)
print('\nS \n%s' %eigen_vals_S)
print('\nS**2 \n%s' %eigen_vals_S2)re
Вывод (Собственные значения и S ** 2 различны):
Собственные значения [2.79331043 1.28393579 0.90313734 0.01961644]
S [ 55.02775284 3.37434634 2.52347705 0.28664958]
S ** 2 [3.02805358e + 03 1.13862132e + 01 6.36793643e + 00 8.21679822e-02]
теперь с такими же результатами:
#Same eigenvalues
eigen_vals, eigen_vecs = np.linalg.eigh((X_train.T).dot(X_train))
eigen_vals = np.asarray(sorted(eigen_vals, reverse=True))
#SVD
U,eigen_vals_S,V = svd(X_train)
eigen_vals_S2 = (eigen_vals_S**2)
print('\nEigenvalues \n%s' % eigen_vals)
print('\nS \n%s' %eigen_vals_S)
print('\nS**2 \n%s' %eigen_vals_S2)
Выход:
Собственные значения [3.02805358e + 03 1.13862132e + 01 6.36793643e + 00 8.21679822e-02]
S [55.02775284 3.37434634 2.52347705 0.2866495
S ** 2 [3.02805358e + 03 1.13862132e + 01 6.36793643e + 00 8.21679822e-02]
И вот чего я не понимаю. Путь со стандартизацией и cov () - это метод для PCA. Но, как вы можете видеть, есть разные результаты, в зависимости от того, как я вычисляю собственные значения ....
Я что-то не так или почему это так?