NumA ve sklearn'te PCA farklı sonuçlar üretir


21

Bir şeyi yanlış mı anlıyorum. Bu benim kodum

sklearn kullanma

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

pca = decomposition.PCA(n_components=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)

Çıktı:

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]])

Numpy yöntemlerini kullanma

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

Çıktı

array([[ 0.06406894,  0.94063993, -1.62373172],
   [-0.35357757,  0.7509653 ,  0.63365168],
   [ 0.29312477,  0.6710958 ,  1.11766206],
   [-0.00361615, -2.36270102, -0.12758202]])
I have kept all 3 components but it doesnt seem to allow me to retain my original data.

Neden böyle olduğunu bilebilir miyim?

Orijinal matrisimi geri almak istersem ne yapmalıyım?


Numpy kodunuz yanlış IMHO (ayrıca Xtanımlanmamış olanı kullanır ). Senin yeniden kontrol et matematik .
Anonim-Mousse-Monica'yı Yeniden

Ben sadece hücreler tarafından kopyalamak böylece ipython dizüstü kullanıyorum. Matematiklerim yanlış mı? Hangi kısım @ Anony-Mousse
aceminer

@ Anony-Mousse Evet
hatamı

@ aceminer Neden x_std değil, x_std.T kovaryans matrisini hesapladığınızı merak ediyorum.
Evgeni Nabokov

@EvgeniNabokov çok uzun zaman oldu. Sry zaten hatırlayamıyorum
aceminer

Yanıtlar:


21

Fark, decomposition.PCAPCA yapmadan önce değişkenlerinizi standartlaştırmamasıdır, oysa manuel hesaplamanızda StandardScalerstandardizasyonu çağırırsınız . Dolayısıyla, şu farkı gözlemliyorsunuz: korelasyon veya kovaryans üzerine PCA?

Eğer değiştirirsen

pca.fit_transform(x)

ile

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

manuel hesaplama ile aynı sonucu alacaksınız ...

... ama sadece PC'lerin sırasına kadar. Çünkü koştuğunda

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

özdeğerleri mutlaka azalan sırada almazsınız. alırım

array([ 0.07168571,  2.49382602,  1.43448827])

Böylece bunları manuel olarak sipariş etmek isteyeceksiniz. Sklearn bunu sizin için yapar.


Orijinal değişkenlerin yeniden yapılandırılmasıyla ilgili olarak, bkz. PCA'nın tersine çevrilmesi ve birkaç temel bileşenden orijinal değişkenlerin nasıl yeniden yapılandırılması?


Sadece kontrol etmek istiyorum. Matrisi standart sapması ile standartlaştırmak gerçekten gerekli mi?
Yapmadıkları

Gerekli değil , bunu yapmanın sadece bir yolu. İlk paragrafta koyduğum bağlantıya bakın: stats.stackexchange.com/questions/53 - hepsi bu soru hakkında. Standartlaştırırsanız, korelasyonlarda PCA yaparsınız. Bunu yapmazsanız, kovaryanslarda PCA yaparsınız.
amip diyor ki Reinstate Monica

9

İşte Python PCA tartışma ve açıklama ile güzel bir uygulama. Bu uygulama scikit PCA ile aynı sonuca götürür. Bu, PCA'nızın yanlış olduğunu gösteren başka bir göstergedir.

import numpy as np
from scipy import linalg as LA

x = np.array([
        [0.387,4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5.52],
        [1.524,6787,3.94],
    ])

#centering the data
x -= np.mean(x, axis = 0)  

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

evals , evecs = LA.eigh(cov)

özdeğerleri (ve buna göre özvektörleri) azalan şekilde sıralamanız gerekir

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

a = np.dot(x, evecs) 

Genel olarak, kodunuzu basit bir örnek (mümkün olduğunca basit) uygulayarak ve doğru sonuçları (ve ara sonuçları) elle hesaplayarak kontrol etmenizi öneririm. Bu, sorunu tanımlamanıza yardımcı olur.


1
Bu yanıtı seviyorum. Sorunumu çözdü!
Jinhua Wang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.