2016-04-15 35 views
1

我正在Python(Numpy)和R中進行數據分析。我的數據是一個向量795067 X 3,並計算此平均值,中值,標準偏差和IQR數據會產生不同的結果,具體取決於我使用的是Numpy還是R.我對這些值進行了交叉檢查,看起來R給出了「正確」的值。浮點數的乘法在Numpy和R中給出了不同的結果

Median: 
Numpy:14.948499999999999 
R: 14.9632 

Mean: 
Numpy: 13.097945407088607 
R: 13.10936 

Standard Deviation: 
Numpy: 7.3927612774052083 
R: 7.390328 

IQR: 
Numpy:12.358700000000002 
R: 12.3468 

兩個平臺上的數據的最大值和最小值是相同的。我跑了一個快速測試,以更好地瞭解這裏發生了什麼。

  • 在Numpy中乘以1.2 * 1.2得到1.4(與R相同)。
  • 乘以1.22 * 1.22在Numpy中給出了1.4884並且與R相同。
  • 然而,在Numpy中乘以1.222 * 1.222給出了1.4932839999999998這顯然是錯誤的!在R中進行乘法給出了1.49324的正確答案。
  • 在Numpy中乘以1.2222 * 1.2222給出1.4937728399999999和1.493773在R中。再一次,R是正確的。

在Numpy中,數字是float64數據類型,它們在R中是雙精度的。這是怎麼回事?爲什麼Numpy和R會給出不同的結果?我知道R使用IEEE754雙精度,但我不知道Numpy使用的精度。我如何改變Numpy來給我「正確的」答案?

+5

這將有助於顯示您的代碼,以便我們可以解決您的實際問題。區分浮動如何被打印*與實際浮點*值*之間的區別也很重要。例如,在R中,'sprintf(「%。20f」,1.222 * 1.222)'打印'「1。49328399999999983372「'與{'.20f}'.format(1.222 * 1.222)'在Python中得到的結果完全相同。浮點值是相同的,但是當你在R提示符下輸入1.222 * 1.222' ,R打印'1.493284',而Python打印'1.4932839999999998' – unutbu

+0

你也可以嘗試將NumPy數據的'dtype'改爲'float128':'data = data.astype(np.float128)',雖然它可能有幫助 – unutbu

+0

@unutbu:R使用64位浮點數,因此在Python中堅持使用64位浮點數是合理的。 –

回答

3

的Python

Python中的print聲明/功能將打印單精度浮點值。計算實際上將以指定的精度完成。蟒/ numpy的默認使用雙精度浮點(至少我的64位機器上):

import numpy 

single = numpy.float32(1.222) * numpy.float32(1.222) 
double = numpy.float64(1.222) * numpy.float64(1.222) 
pyfloat = 1.222 * 1.222 

print single, double, pyfloat 
# 1.49328 1.493284 1.493284 

print "%.16f, %.16f, %.16f"%(single, double, pyfloat) 
# 1.4932839870452881, 1.4932839999999998, 1.4932839999999998 

在一個交互式Python/IPython的殼,殼打印雙精度結果的打印語句的結果時:

>>> 1.222 * 1.222 
1.4932839999999998 

In [1]: 1.222 * 1.222 
Out[1]: 1.4932839999999998 

[R

它看起來如R使用printsprintf當是做一樣的Python:

print(1.222 * 1.222) 
# 1.493284 

sprintf("%.16f", 1.222 * 1.222) 
# "1.4932839999999998" 
的Python和R之間

> 1.222 * 1.222 
[1] 1.493284 

差異

在搜索結果的差異可能會導致來自:

相較於交互式Python外殼,交互式[R外殼印花語句的結果時,也打印單精度在numpy中使用單精度值。有很多附加的計算/減法將最終使問題面:

In [1]: import numpy 

In [2]: a = numpy.float32(1.222) 

In [3]: a*6 
Out[3]: 7.3320000171661377 

In [4]: a+a+a+a+a+a 
Out[4]: 7.3320003 

正如在評論你的實際問題的建議,請務必使用雙精度在numpy的計算浮動。

相關問題