Was ist der Unterschied zwischen scipy.special.binom und scipy.misc.comb?

9

Was ist der Unterschied zwischen scipy.special.binom und scipy.misc.comb?

In ipython kann ich sehen, dass sie verschiedene Typen zurückgeben und auch unterschiedliche Genauigkeit haben.

%Vor%

Aber was genau machen sie anders?

Ссылка , sagt scipy.special.binom

%Vor%

scipy.misc.comb ruft scipy.special.gammal auf, dessen Zeile in generate_ufuncs.py

sagt %Vor%     
Anush 03.02.2014, 19:21
quelle

1 Antwort

10

Immer wenn Sie auf eine Situation stoßen, in der Sie nicht wissen, was Code tut, und es nicht einfach ist, einfach das übergeordnete Modul in einen Interpreter zu importieren und die Ausführung des Codes, der Docstrings usw. zu überprüfen, dann Sie habe ein paar Optionen.

Lassen Sie mich zwei Optionen beschreiben, die sich dieses Mal nicht als sehr hilfreich erwiesen haben, die aber in Zukunft eine gute Möglichkeit sind, mit einer solchen Frage zu beginnen (so dass Sie die Ergebnisse dieser Versuche mit einbeziehen können.) dass du ein paar Sachen ausprobiert hast, bevor du hier gepostet hast, und um auszusehen, was diese Dinge sind):

Sie können das Modul dis verwenden, um den Python-Code in die ausgeführten Op-Codes zu zerlegen, etwa so:

%Vor%

Wenn Sie ein Betriebssystem * nix verwenden, können Sie (fast immer) strace verwenden, um etwas zu starten und die ausgeführten Systemaufrufe zu überprüfen. In diesem Fall könnten Sie sich die Ausgabe von

ansehen %Vor%

versus

%Vor%

(Die -qc -Option macht die Ausgabe weniger chatty und aggregiert die Zeit, die in verschiedenen Systemaufrufen verbracht wird, was leichter als ein erster Start zu lesen ist. Wenn Sie den -qc -Teil weglassen, erhalten Sie einen großen Screenshot aller Systemaufrufe ... etwas, das Sie in Emacs öffnen und durchsuchen oder an ein Systemwerkzeug zur Suche weiterleiten möchten.

In diesem Fall hilft strace nicht zu viel und es gibt eine Menge lauter Systemaufrufe, die sich nur auf die Importe der Module beziehen.

Was mir diesmal geholfen hat, ist cProfile :

%Vor%

In diesem Fall konnte ich sehen, dass die erste Ausführung auf einen Systemaufruf in scipy.special.orthogonal_eval hinausläuft und das Googlen dieses Moduls ergab, dass wir über eine gemeinsam genutzte Bibliothek sprechen, die als Datei orthogonal_eval.so erstellt wurde und ich fand diese nette Seite mit dem Quellcode .

Sie können dort die vollständige Funktionsdefinition von binom sehen, die eine Standardberechnung der Faktoren enthält, die in die Formel für kleine Werte involviert sind, und eine Annäherung mit anderen speziellen Funktionen (ich sehe einige Aufrufe von "Gamma", " beta "und" lbeta "definiert in einer Datei namens cephes.h ).

Sieht ziemlich normal aus - wenn ich müsste, kann ich die .h -Datei durchsuchen und Google noch mehr und finde wahrscheinlich eine lange C-Bibliothek mit speziellen Funktionen ganz unten.

>

Betrachten Sie für misc.comb zunächst die regelmäßige Dokumentation dies ist verfügbar (für mich ist es nicht verfügbar für binom ).

Der Docstring sagt, dass es ein mögliches drittes Argument gibt, exact , das auf etwas anderes als 0 gesetzt werden kann, wenn Sie nicht möchten, dass ein float zurückgegeben wird. In diesem Fall wird long zurückgegeben, aber Sie können auch in int umwandeln, wenn Sie möchten.

Dies erklärt die Genauigkeitsfrage. Sie können in orthogonal_eval lesen, wenn k relativ klein ist und die Antwort eine Ganzzahl (Ganzzahl-Argumente) ergibt, dann wird etwas mit weniger Rundungsfehler verwendet. Während comb dies nur tut, wenn Sie exact=1 (oder irgend etwas anderes mit exact != 0 ) sagen.

Wie für den Code, den comb ausführt, können wir Sehen Sie sich die Quelle an , die von der SciPy-Dokumentationsseite verlinkt ist.

Diese Funktion verwendet auch einige Hilfsfunktionsaufrufe von scipy.special , aber die Mischung zwischen dem, was in der Python-Ebene und der C-Ebene genannt wird, ist anders, und die Implementierung für den Approximationsteil ist ebenfalls etwas anders.

Ich bin mir nicht sicher, welches Spezifitätsniveau Sie benötigen, aber ich würde sagen, dass diese Detailgenauigkeit für die meisten Zwecke ausreichen sollte: binom wird direkt in der C-Erweiterungsebene in orthogonal_eval implementiert und führt einige Optimierungen durch um Genauigkeitsprobleme für kleine Eingaben zu reduzieren. misc implementiert die kleinen Eingabestoffe in Python direkt und nutzt special Aufrufe, ohne binom selbst durchlaufen zu müssen - also gab es ein gewisses Maß, das Rad für denjenigen, der diese programmiert hat, neu zu erfinden. Da sie Funktionsaufrufe zwischen der Python-Ebene und der C-Ebene mischen und abgleichen, ist es nicht verwunderlich, dass es einige Genauigkeitsunterschiede gibt.

    
ely 03.02.2014, 21:24
quelle

Tags und Links