2015-04-13 7 views
6

Ich habe die normale PCA von scikit-lernen und erhalten die Varianz-Verhältnisse für jede Hauptkomponente ohne irgendwelche Probleme.scikit-lernen kernel PCA erklärte Varianz

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

möchte ich differnt Kernel erkunden PCA mit Kernel und wollen auch die erklärten Varianz Verhältnisse aber ich jetzt sehe es dieses Attribut nicht haben. Weiß jemand, wie man diese Werte erhält?

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

Attribute: ‚KernelPCA‘ Objekt hat kein Attribut ‚explained_variance_ratio_‘

Antwort

9

Ich weiß, diese Frage ist alt, aber ich lief in das gleiche ‚Problem‘ und fand eine einfache Lösung, als ich erkennen, dass die pca.explained_variance_ ist einfach die Varianz der Komponenten. Sie können einfach die erklärte Varianz (und Verhältnis) berechnen, indem Sie:

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

und als Bonus, wird der kumulierte Anteil erklärter Varianz zu erhalten (oft nützliche Komponenten bei der Auswahl und die Dimensionalität des Raumes Schätzung):

numpy.cumsum(explained_variance_ratio) 
+0

Schöne Ergebnisse! Nur eine kurze Anmerkung: Dies funktioniert nur, wenn Sie n-1 Komponenten berücksichtigen. Dabei ist n die Anzahl der Features in Ihrem Dataset. – yellow01

0

Der Hauptgrund, warum K-PCA explained_variance_ratio_ nicht hat, ist, weil nach der Kernel-Transformation Ihrer Daten/Vektoren in verschiedenen Feature-Raum leben. Daher soll K-PCA nicht wie PCA interpretiert werden.

0

ich war auch davon fasziniert, also habe ich ein paar Tests gemacht. Unten ist mein Code.

Die Diagramme zeigen, dass die erste Komponente des kernelpca ein besserer Diskriminator des Datensatzes ist. Wenn jedoch die erklärten_Varianzraten auf der Grundlage von @EelkeSpaak erklärt werden, sehen wir nur eine um 50% erklärte Varianz, die keinen Sinn ergibt. daher neigt es dazu, der Erklärung von Krishna Kalyan zuzustimmen.

#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

fügen Sie die Plots zur Antwort hinzu – Kanmani