2016-04-10 158 views
-1

我正在對數據進行功能縮放,R和Python在縮放中給出了不同的答案。 R和Python爲許多統計值給出了不同的答案:R和Python給出不同的結果(中位數,IQR,平均值和STD)

中位數: Numpy給出14.948499999999999與此代碼:np.percentile(X[:, 0], 50, interpolation = 'midpoint')。 Python中內置的Statistics包使用以下代碼給出了相同的答案:statistics.median(X[:, 0])。另一方面,R給出了這個結果14.9632與此代碼:median(X[, 1])。有趣的是,R中的summary()函數的中位數爲14.960。

當計算相同數據的mean時會發生類似的差異。 R給出13.10936使用內置的mean()函數,Numpy和Python Statistics包給出13.097945407088607

同樣,計算標準偏差時也會發生同樣的情況。 R給出7.390328和Numpy(DDOF = 1)給出7.3927612774052083。 DDOF = 0時,Numpy給出7.3927565984408936

IQR也給出了不同的結果。使用R中內置的IQR()函數,給出的結果是12.3468。對此代碼使用Numpy:np.percentile(X[:, 0], 75) - np.percentile(X[:, 0], 25)結果爲12.358700000000002

這是怎麼回事?爲什麼Python和R總是給出不同的結果?這可能有助於知道我的數據有795066行,並且在Python中被視爲np.array()。同樣的數據被視爲在R.

+0

可能的罪魁禍首是數值精度。 R數值存儲爲雙精度,而我懷疑python的默認值是將數字存儲爲float。檢查你的python變量的存儲類型,你可能會發現它們是浮動的。就R中的'summary()'函數而言,我相信默認值是打印四捨五入的數值。你應該可以用'format'參數來改變這個行爲。 – lmo

+1

numpy中的默認浮點類型是'numpy.float64'(即雙精度)。但是如果數組實際上是'numpy.float32'(單精度),那可以解釋這些差異。 @倫敦,什麼是'X.dtype'? –

+0

@WarrenWeckesser X.dtype是float64。希望有所幫助! –

回答

1

matrix TL;博士有在即使是這些簡單的彙總統計算法一些潛在的分歧,但鑑於你看到全線甚至差異相對簡單的計算,例如中位數,我認爲問題更可能是在平臺之間的轉換中,值被截斷/修改/丟失精度。

(這是一個多回答一個擴展評論,但長期以來,人們越來越笨拙。)

  • 你不可能得到更遠,而不重複的例子;有各種方法可以創建示例來測試差異假設,但如果您自己這樣做,而不是讓回答者這樣做,那會更好。

  • 你如何從Python/R傳輸數據?轉移中使用的表示法有一些舍入嗎? (你得到的最大/最小值,應該基於一個沒有浮點計算的單個數值?如果你減掉一個值得到一個奇數長度的向量並取中位數,那麼最大/最小值是多少?)

  • medians:我最初想說的是,這可能是定義一個偶數長度矢量的分位數插值的不同方法的函數,但中位數的定義比一般分位數更簡單,所以我不確定。在這種情況下,您上面報告的差異似乎太大而不能由浮點運算驅動(因爲計算結果只是兩個相似數值的平均值)。

  • IQRs:類似地,有百分的不同可能的定義/分位數:見?quantile在R.

  • 位數()與摘要():在降低精度的r summary()報告值(通常用於快速瀏覽);這是a common source of confusion

  • 意思/SD:有在這裏的算法,一些可能的細微之處 - 例如,R相加來減少不穩定之前排序向量,我不知道如果Python做或沒有。

x <- rnorm(1000000,mean=0,sd=1) 
> mean(x) 
[1] 0.001386724 
> sum(x)/length(x) 
[1] 0.001386724 
> mean(x)-sum(x)/length(x) 
[1] -1.734723e-18 

同樣,還有更多 - 和不太穩定的方式來計算:但是,這不應該是你看到的,除非數據是有點怪異作出多大區別方差/標準偏差。