C # NMath zu Python SciPy
Frage
Ich muß Port einige Funktionen von C # zu Python, aber ich kann nächsten Code rechts nicht implementieren:
[SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
public static SqlDouble LogNormDist(double probability, double mean, double stddev)
{
LognormalDistribution lnd = new LognormalDistribution(mean,stddev);
return (SqlDouble)lnd.CDF(probability);
}
Dieser Code verwendet CenterSpace NMath Bibliothek.
Wer kann mir helfen, eine richtige Funktion in Python zu schreiben, die an diesen Code ähnlich sein werden?
Sorry für mein Englisch.
UPD Eigentlich verstehe ich nicht, welche scipy.stats.lognorm.cdf attrs zu C # Wahrscheinlichkeit simillar sind, bedeuten, stddev
Wenn nur bestehende Ordnung zu Python zu kopieren, wie in der Antwort unten, erhalte ich falsche Nummer.
Lösung
Scipy hat eine Reihe von Distributionen im scipy.stats Paket definiert
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,mean)
Update
Okay, es sieht aus wie Scipy der stat Definitionen etwas Nicht-Standard sind. Hier ist das Ende des docstring für scipy.stats.lognormal
Lognormalverteilung
lognorm.pdf (x, s) = 1 / (s x sqrt (2 * pi)) * exp (-1 / 2 * (log (x) / s) ** 2 ) für x> 0, s> 0 ist.
Wenn log x normalerweise mit einem Mittelwert mu und Varianz Sigma ** 2 verteilt wird, x ist dann ein, die normalerweise mit Form Paramter Sigma und Skala verteilt Parameter exp (mu).
Vielleicht versuchen
return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))
Wenn das immer noch nicht funktioniert, versucht einige Beispiele Punkte bekommen und ich werde sehen, ob ich eine Arbeitsbeziehung finden.
udpate 2
Oops, ich wusste nicht, dass die Skala param ein Schlüsselwort ist. Dieser soll jetzt funktionieren:
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))
Prost und viel Glück mit Ihrem Projekt!
Andere Tipps
Die Python-Dokumente beschreiben ein Verfahren random.lognormvariate (mu, Sigma):
http://docs.python.org/library/random.html
Vielleicht ist das, was Sie wollen.
Vielleicht können Sie verwenden Python.NET (dies ist nicht Ironpython), ermöglicht es .NET-Komponenten und Dienste zuzugreifen:
Ivan,
Wir haben kein Interesse daran haben die Leute zu halten in NMath gesperrt. Hier ist, was wir in NMath tun.
double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
return ( 0.5 + 0.5 * Erf( t ) );
Dabei steht
private static double Erf( double x )
{
return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}
Das sollte helfen ...
- Trevor