2016-08-07 69 views
0

我的一位朋友正在用Pythons包uncertainties評估數據。我是她的統計顧問,我在她的代碼中出現了一個奇怪的結果。總結蟒蛇的不確定性,給出與預期不同的結果

sum(array)sqrt(sum(unumpy.std_devs(array)**2))產生不同的結果,第二個是工程中常用的方差法。

現在,我知道方差法只適用於誤差小於部分導數(因爲泰勒級數)的情況,在這種情況下不會給出誤差,但uncertainties如何處理?我怎樣才能以任何方式再現不確定性呢?

回答

0

這導致由於我array作爲一個AffineScalarFunc(如與Variable相反),因此它們不僅存儲該值,而且還存儲值取決於的所有變量。現在

,我的值不完全獨立的(這是不明確的,在第一眼*全部),並且因此sum(array)還考慮根據我的協方差矩陣的非對角線元素到this式(抱歉該物品是德文的,但英文維基百科formula不是那麼直觀),而sqrt(sum(unumpy.std_devs(array)**2))顯然不會,只是將對角元素加起來。

一個方式重現所做的不確定因素是:

from uncertainties import covariance_matrix 

sum=0 
for i in range(0,len(array)): 
    for j in range(0,len(array)): 
     sum+=covariancematrix(array)[i][j] 

print(sqrt(sum)) 

然後unumpy.std_devs(sum(array))==sqrt(sum)True

*由於使用從相同插值(測量結果)中獲取的數據而導致的相關性,並且因爲測量的長度計算爲兩次差異(並且測量是連續的,所以時間現在是相關的!)

0

你忘了標出錯誤的方差。這應該工作,並等於sum(array)錯誤:

sqrt(sum(unumpy.std_devs(array)**2)) 

然後

from uncertainties import unumpy 
import random 
import math 

a = [uc.ufloat(random.random(), random.random()) for _ in range(100)] 

sa = unumpy.std_devs(sum(a))  
sb = math.sqrt(sum(unumpy.std_devs(a)**2)) 

print(sa) 
print(sb) 
print(sa == sb) 

將會導致一個類似

5.793714811166615 
5.793714811166615 
True 
+0

我的不好!我會馬上改正!這是一個錯字,代碼實際上有一個** 2。 – Tilman

+0

然後應該沒有問題。看我的編輯給出一個明確的例子。 – Aguy

+0

我終於得到了代碼,不僅截圖並發現了「錯誤」。你的答案雖然很好,但我可以幫助我找到它,因爲我認爲這可能是由於(顯然)並非如此。 – Tilman