2015-04-13 21 views
6

Ho usato il normale PCA da scikit-learn e ho ottenuto i rapporti di varianza per ciascun componente principale senza problemi.scikit-learn kernel PCA ha spiegato la varianza

pca = sklearn.decomposition.PCA(n_components=3) 
pca_transform = pca.fit_transform(feature_vec) 
var_values = pca.explained_variance_ratio_ 

voglio esplorare kernel differnt utilizzando kernel PCA e vogliono anche i rapporti di varianza spiegata, ma ora sto vedendo non ha questo attributo. Qualcuno sa come ottenere questi valori?

kpca = sklearn.decomposition.KernelPCA(kernel=kernel, n_components=3) 
kpca_transform = pca.fit_transform(feature_vec) 
var_values = kpca.explained_variance_ratio_ 

AttributeError: oggetto 'KernelPCA' non ha alcun attributo 'explained_variance_ratio_'

risposta

9

So che questa domanda è vecchio, ma ho incontrato lo stesso 'problema' e ha trovato una soluzione facile, quando ho capito che il pca.explained_variance_ è semplicemente la varianza dei componenti. Si può semplicemente calcolare la varianza spiegata (e ratio) facendo:

kpca_transform = kpca.fit_transform(feature_vec) 
explained_variance = numpy.var(kpca_transform, axis=0) 
explained_variance_ratio = explained_variance/numpy.sum(explained_variance) 

e come bonus, per ottenere la proporzione cumulativa spiegato varianza (spesso utili nella scelta dei componenti e stimare la dimensionalità dello spazio):

numpy.cumsum(explained_variance_ratio) 
+0

Risultati interessanti! Solo una breve nota: funziona solo se si considerano componenti n-1. Dove n è il numero di funzioni nel set di dati. – yellow01

0

Il motivo principale per cui K-PCA non ha explained_variance_ratio_ è perché dopo la trasformazione del kernel dei dati/vettori vivono in uno spazio di funzioni diverso. Quindi K-PCA non dovrebbe essere interpretato come PCA.

0

sono stato incuriosito da questo così ho fatto qualche test. di seguito è il mio codice.

i grafici mostreranno che il primo componente del kernelpca è un discriminatore migliore del set di dati. tuttavia, quando vengono spiegati i coefficienti_varianza_dati basati sulla spiegazione @EelkeSpaak, vediamo solo un rapporto di spiegazione della varianza del 50% che non ha senso. quindi mi tende ad essere d'accordo con la spiegazione di @Krishna Kalyan.

#get data 
from sklearn.datasets import make_moons 
import numpy as np 
import matplotlib.pyplot as plt 

x, y = make_moons(n_samples=100, random_state=123) 
plt.scatter(x[y==0, 0], x[y==0, 1], color='red', marker='^', alpha=0.5) 
plt.scatter(x[y==1, 0], x[y==1, 1], color='blue', marker='o', alpha=0.5) 
plt.show() 

##seeing effect of linear-pca------- 
from sklearn.decomposition import PCA 
pca = PCA(n_components=2) 
x_pca = pca.fit_transform(x) 

x_tx = x_pca 
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3)) 
ax[0].scatter(x_tx[y==0, 0], x_tx[y==0, 1], color='red', marker='^', alpha=0.5) 
ax[0].scatter(x_tx[y==1, 0], x_tx[y==1, 1], color='blue', marker='o', alpha=0.5) 
ax[1].scatter(x_tx[y==0, 0], np.zeros((50,1))+0.02, color='red', marker='^', alpha=0.5) 
ax[1].scatter(x_tx[y==1, 0], np.zeros((50,1))-0.02, color='blue', marker='o', alpha=0.5) 
ax[0].set_xlabel('PC-1') 
ax[0].set_ylabel('PC-2') 
ax[0].set_ylim([-0.8,0.8]) 
ax[1].set_ylim([-0.8,0.8]) 
ax[1].set_yticks([]) 
ax[1].set_xlabel('PC-1') 
plt.show() 

##seeing effect of kernelized-pca------ 
from sklearn.decomposition import KernelPCA 
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15) 
x_kpca = kpca.fit_transform(x) 


x_tx = x_kpca 
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3)) 
ax[0].scatter(x_tx[y==0, 0], x_tx[y==0, 1], color='red', marker='^', alpha=0.5) 
ax[0].scatter(x_tx[y==1, 0], x_tx[y==1, 1], color='blue', marker='o', alpha=0.5) 
ax[1].scatter(x_tx[y==0, 0], np.zeros((50,1))+0.02, color='red', marker='^', alpha=0.5) 
ax[1].scatter(x_tx[y==1, 0], np.zeros((50,1))-0.02, color='blue', marker='o', alpha=0.5) 
ax[0].set_xlabel('PC-1') 
ax[0].set_ylabel('PC-2') 
ax[0].set_ylim([-0.8,0.8]) 
ax[1].set_ylim([-0.8,0.8]) 
ax[1].set_yticks([]) 
ax[1].set_xlabel('PC-1') 
plt.show() 

##comparing the 2 pcas------- 

#get the transformer 
tx_pca = pca.fit(x) 
tx_kpca = kpca.fit(x) 

#transform the original data 
x_pca = tx_pca.transform(x) 
x_kpca = tx_kpca.transform(x) 

#for the transformed data, get the explained variances 
expl_var_pca = np.var(x_pca, axis=0) 
expl_var_kpca = np.var(x_kpca, axis=0) 
print('explained variance pca: ', expl_var_pca) 
print('explained variance kpca: ', expl_var_kpca) 

expl_var_ratio_pca = expl_var_pca/np.sum(expl_var_pca) 
expl_var_ratio_kpca = expl_var_kpca/np.sum(expl_var_kpca) 

print('explained variance ratio pca: ', expl_var_ratio_pca) 
print('explained variance ratio kpca: ', expl_var_ratio_kpca) 
+0

aggiungi i grafici alla risposta – Kanmani