2016-08-07 21 views
0

Ein Freund von mir bewertet Daten mit Pythons-Paket uncertainties. Ich bin ihr Statistikberater, und ich habe ein merkwürdiges Ergebnis in ihrem Code gefunden.Summe mit Pythons Unsicherheiten geben ein anderes Ergebnis als erwartet

sum(array) und sqrt(sum(unumpy.std_devs(array)**2)) unterschiedliche Ergebnisse liefern, wobei die zweite die Varianzmethode ist, wie sie normalerweise im Ingenieurwesen verwendet wird.

Nun weiß ich, dass der Varianzansatz nur dann geeignet ist, wenn der Fehler im Vergleich zum Teilderivat (wegen der Taylor-Reihe) klein ist, was in diesem Fall nicht gegeben ist, aber wie geht das? ? Und wie kann ich irgendwelche Unsicherheiten reproduzieren?

Antwort

0

Dies führt aufgrund meiner array eine AffineScalarFunc sein (wie im Gegensatz zu einem Variable), und so speichern sie nicht nur den Wert, sondern auch alle Variablen, dass der Wert vonabhängt.

Nun sind meine Werte nicht völlig unabhängig (was auf den ersten Blick gar nicht klar war *), und somit berücksichtigt sum(array) auch die nichtdiagonalen Elemente meiner Kovarianzmatrix gemäß this Formel (Entschuldigung, dass der Artikel ist in Deutsch, aber Englisch Wikipedias formula ist nicht so intuitiv), während sqrt(sum(unumpy.std_devs(array)**2)) offensichtlich nicht und nur addiert die diagonalen Elemente.

Eine Art und Weise, was Unsicherheiten zu reproduzieren macht, ist:

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

Und dann unumpy.std_devs(sum(array))==sqrt(sum) ist True.

* Korrelation aufgrund der Verwendung von Daten aus der gleichen Interpolation (von Messungen) und weil die Länge einer Messung als die Differenz von zwei Mal berechnet wurde (und Messungen waren aufeinander folgend, so sind die Zeiten jetzt korreliert!)

0

Sie haben vergessen, den Standardfehler zu quadrieren, um es zur Varianz zu machen. Dies sollte funktionieren und auf den Fehler von sum(array) gleich:

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

Dann

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) 

führt mit so etwas wie

5.793714811166615 
5.793714811166615 
True 
+0

Mein schlechtes! Ich werde das sofort korrigieren! Das war ein Tippfehler, der Code hat tatsächlich eine "** 2". – Tilman

+0

Dann sollte es kein Problem geben. Sehen Sie meine Bearbeitung, um ein explizites Beispiel zu geben. – Aguy

+0

Ich habe endlich den Code und nicht nur Screenshots und habe den "Fehler" gefunden. Ihre Antwort war großartig, um mir zu helfen, es zu finden, obwohl ich dachte, dass es aufgrund bestimmter Werte sein könnte, die (offensichtlich) nicht der Fall war. – Tilman