Spørsmål:
PCA i nummen og sklearn gir forskjellige resultater
aceminer
2016-09-20 09:45:53 UTC
view on stackexchange narkive permalink

Misforstår jeg noe. Dette er koden min

bruker sklearn

  import numpy som npimport matplotlib.pyplot som pltfra mpl_toolkits.mplot3d import Axes3Dfra sklearn import dekomponering fra sklearn importer datasett fra sklearn.preprocessing import StandardScalerpca = dekomponering.PCA (n_komponenter = 3) x = np.array ([[0.387.4878, 5.42], [0.723,12104,5.25], [1,12756,5.52], [1.524.6787, 3.94],]) pca.fit_transform (x)  

Output:

  array ([[-4.25324997e + 03 , -8.41288672e-01, -8.37858943e-03], [2.97275001e + 03, -1.25977271e-01, 1.82476780e-01], [3.62475003e + 03, -1.56843494e-01, -1.65224286e-01] , [-2.34425007e + 03, 1.12410944e + 00, -8.87390454e-03]])  

Bruke numpe metoder

  x_std = StandardScaler (). fit_transform (x) cov = np.cov (x_std.T) ev, eig = np.linalg.eig (cov) a = eig.dot (x_std.T)  

Output

  array ([[0.06406894, 0.940639 93, -1.62373172], [-0.35357757, 0.7509653, 0.63365168], [0.29312477, 0.6710958, 1.11766206], [-0.00361615, -2.36270102, -0.12758202]]) Jeg har beholdt alle 3 komponentene, men det ser ikke ut til å tillate meg å beholde mine opprinnelige data.  

Kan jeg vite hvorfor er det slik?

Hvis jeg vil få tilbake den opprinnelige matrisen min, hva skal jeg gjøre?

Den numme koden din er feil IMHO (den bruker også 'X' som ikke er definert).Sjekk * matte * på nytt.
Jeg bruker ipython-notatbok, så jeg kunne bare kopiere etter celler.Matematikken min er feil?Hvilken del @Anony-Mousse
@Anony-Mousse Ja, jeg skjønte feilen min, men den stemmer fortsatt ikke overens
@aceminer Jeg er nysgjerrig på hvorfor du beregner kovariansmatrise av x_std.T, ikke x_std?
-1
@aceminer Jeg antar at du transponerer matrise fordi i dine data "representerer hver kolonne en variabel, mens radene inneholder observasjoner".I så fall er det mer informativt å bruke parameteren rowvar = False, ikke transponere.Se svaret fra Nikolas Rieble.
Matematisk sett inkluderer ikke selve PCA StandardScaler (). Fit_transform (x);Hvis du standardiserer det, blir PCA utført på korrelasjonsmatrisen, i stedet for ko-variansmatrisen;det er derfor scikit learning ikke setter det trinnet.
To svar:
amoeba
2016-09-20 14:57:45 UTC
view on stackexchange narkive permalink

Forskjellen er fordi dekomponering.PCA ikke standardiserer variablene dine før du gjør PCA, mens du i din manuelle beregning ringer til StandardScaler for å gjøre standardiseringen. Derfor observerer du denne forskjellen: PCA på korrelasjon eller kovarians?

Hvis du bytter ut

  pca.fit_transform (x)
 

med

  x_std = StandardScaler (). fit_transform (x)
pca.fit_transform (x_std)
 

får du det samme resultatet som ved manuell beregning ...

... men bare opp til rekkefølgen på PC-ene. Det er fordi når du løper

  ev, eig = np.linalg.eig (cov)
 

får du egenverdier ikke nødvendigvis i avtagende rekkefølge. Jeg får

  matrise ([0.07168571, 2.49382602, 1.43448827])
 

Så du vil bestille dem manuelt. Sklearn gjør det for deg.


Angående rekonstruering av originale variabler, se Hvordan reversere PCA og rekonstruere originale variabler fra flere hovedkomponenter?

Vil bare sjekke.Er det virkelig nødvendig å standardisere matrisen etter standardavviket?Jeg så eksempler der de ikke gjør det
Det er ikke * nødvendig *, det er bare en måte å gjøre det på.Se lenken jeg la i første avsnitt: http://stats.stackexchange.com/questions/53 - det handler egentlig bare om dette spørsmålet.Hvis du standardiserer, gjør du PCA på korrelasjoner.Hvis du ikke gjør det, gjør du PCA på kovarianter.
Nikolas Rieble
2016-09-20 14:57:52 UTC
view on stackexchange narkive permalink

Her er en fin implementering med diskusjon og forklaring av PCA i python.Denne implementeringen fører til det samme resultatet som scikit PCA.Dette er en annen indikator på at PCA-en din er feil.

  importer numpy som np
fra scipy import linalg som LA

x = np.array ([
        [0.387.4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5,52],
        [1.524.6787,3.94],
    ])

#centrering av dataene
x - = np.mean (x, akse = 0)

cov = np.cov (x, rowvar = False)

evals, evecs = LA.eigh (cov)
 

du må sortere egenverdiene (og egenvektorene tilsvarende) synkende

  idx = np.argsort (evals) [:: - 1]
evecs = evecs [:, idx]
evals = evals [idx]

a = np.dot (x, evecs)
 

Generelt, anbefaler jeg deg å sjekke koden din ved å implementere et enkelt eksempel (så enkelt som mulig) og beregne for hånd riktig resuls (og mellomresultater) for hånd.Dette hjelper deg med å identifisere problemet.

Elsker dette svaret.Det løste problemet mitt!


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...