2012-06-28 6 views
5

Belki de bir hata yapıyorum z-normalizing dizim. Birisi şuna bir bakıp neler olduğunu önerebilir mi? R iseÇıkış değerleri R ve Python arasında farklılık gösterir?

: Python'da

> data <- c(2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34) 
> data.mean <- mean(data) 
> data.sd <- sqrt(var(data)) 
> data.norm <- (data - data.mean)/data.sd 
> print(data.norm) 
[1] -0.9796808 -0.8622706 -0.6123005 0.8496459 1.7396910 1.5881940 1.0958286 0.5277147 0.4709033 -0.2865819 
[11] 0.0921607 -0.2865819 -0.9039323 -1.1955641 -1.2372258 

numpy kullanılarak: I yanlış numpy kullanılarak AM

>>> import string 
>>> import numpy as np 
>>> from scipy.stats import norm 
>>> data = np.array([np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34])]) 
>>> data -= np.split(np.mean(data, axis=1), data.shape[0]) 
>>> data *= np.split(1.0/data.std(axis=1), data.shape[0]) 
>>> print data 

[[-1.01406602 -0.89253491 -0.63379126 0.87946705 1.80075126 1.64393692 
    1.13429034 0.54623659 0.48743122 -0.29664045 0.09539539 -0.29664045 
    -0.93565885 -1.23752644 -1.28065039]] 

?

+0

Niçin "veri" bir np.array içinde np.array olarak ayarlanıyor? –

+0

@HughBothwell: Oh ... Bunu fark etmedim. Bu, verilerin bir dizi dizisi olduğu daha büyük bir kod parçasından basitleştirildi. – Legend

+1

Sadece kayıt için, R 'data.norm <- scale (data, center = TRUE, scale = TRUE)' yi kullanarak normalleştirebilirsiniz ' – Marius

cevap

9

NumPy sonucunuzun doğru olduğuna inanıyorum. Gerçi daha basit bir şekilde normalleşmesini yapacağını:

senin iki sonuç arasındaki farkın normalleşme yatıyor

>>> data = np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34]) 
>>> data -= data.mean() 
>>> data /= data.std() 
>>> data 
array([-1.01406602, -0.89253491, -0.63379126, 0.87946705, 1.80075126, 
     1.64393692, 1.13429034, 0.54623659, 0.48743122, -0.29664045, 
     0.09539539, -0.29664045, -0.93565885, -1.23752644, -1.28065039]) 
: r R sonucu:
>>> r/data 
array([ 0.96609173, 0.96609173, 0.96609173, 0.96609179, 0.96609179, 0.96609181, 0.9660918 , 0.96609181, 
     0.96609179, 0.96609179,  0.9660918 , 0.96609179, 0.96609175, 0.96609176, 0.96609177]) 

Böylece sizin iki sonuç

vardır çoğunlukla birbirleriyle orantılıdır. Bu nedenle R ve Python ile elde edilen standart sapmaları karşılaştırmak isteyebilirsiniz.

PS: Şimdi olsa düşünüyorum ki bu numpy ve R varyans aynı şekilde tanımlanmamış olmasından kaynaklanıyor olabilir: N elemanları, bazı araçlar yerine N ait N-1 ile normalleştirmek hesaplanırken varyans. Bunu kontrol etmek isteyebilirsiniz.

PPS: İşte çelişkinin nedeni geçerli: faktörlere farkı iki farklı normalleştirme sözleşmeler geliyor: 0,9660917 ... (gözlenen faktör basitçe sqrt olan (14/15) = veri 15 öğesi vardır çünkü). Böylece, R'de Python ile aynı sonucu elde etmek için R sonucunu bu faktöre bölmeniz gerekir.

+0

+1 Onay için teşekkürler. Bu yaklaşım, verilerde birden fazla diziye sahip olduğunda (benim sorunumda olduğu gibi çoklu dizi öğeleri) durum için genişletilebilir mi? Ayrıca, R'nin sonucunun neden farklı olduğu hakkında bir fikrin var mı? – Legend

+1

@Legend R'nin n-1'i payda olarak kullandığını onaylayabilirim ve sadece bu farkın olabileceğini düşünüyordum. Bir istatistik adamı olarak, aslında numpy'nin varsayılan olarak n'yi kullanacağı konusunda biraz şoke oldum, ama eminim ki birisi şu anda R'nin tam tersini söylüyor. – joran

+0

@Legend: Dizilerde dizileriniz varsa, cevabınızda kullandığınız 'axis = 1' parametresi yoldur. – EOL

14

Farklı sonuçlar almanızın sebebi, standart sapma/varyansın nasıl hesaplandığıyla ilgilidir. R, paypal N değerini kullanarak hesaplarken, payda N-1 kullanarak hesaplar. Varsayımı hesaplarken payda olarak N-1 değerini kullanmasını söyleyen data.std(ddof=1)'u kullanarak R sonucuna eşit bir numpy sonucu alabilirsiniz.

+1

+1, düzeltici faktörü el ile koymaktan daha kolaydır. – EOL

+0

+1 Yaklaşım için teşekkürler! – Legend