C # Nmath a Python SciPy
Domanda
Devo eseguire il porting di alcune funzioni da C # a Python, ma non riesco ad implementare il codice successivo giusto:
[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);
}
Questo codice utilizza la libreria CenterSpace Nmath.
Chiunque può aiutarmi a scrivere una funzione corretta in Python, che sarà simile a questo codice?
Ci scusiamo per il mio inglese.
UPD In realtà, non capisco quali attr di scipy.stats.lognorm.cdf sono simili a probabilità C #, media, stddev
Se copio l'ordine esistente su Python, come nella risposta sotto, ottengo un numero sbagliato.
Soluzione
Scipy ha un sacco di distribuzioni definite nel pacchetto scipy.stats
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,mean)
Aggiornamento
Ok, sembra che le definizioni delle statistiche di Scipy siano un po 'fuori standard. Ecco la fine della documentazione per scipy.stats.lognormal
Distribuzione lognormale
lognorm.pdf (x, s) = 1 / (s x sqrt (2 * pi)) * exp (-1 / 2 * (log (x) / s) ** 2 ) per x > 0, s > 0.
Se log x è normalmente distribuito con media mu e varianza sigma ** 2, quindi x viene normalmente distribuito in modo logico con sigma di forma e scala parametro exp (mu).
Quindi forse prova
return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))
Se il problema persiste, prova a ottenere alcuni punti di esempio e vedrò se riesco a trovare una relazione di lavoro.
Udpate 2
Oops, non mi rendevo conto che il parametro scale è una parola chiave. Questo dovrebbe ora funzionare:
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))
Saluti e buona fortuna con il tuo progetto!
Altri suggerimenti
I documenti di Python descrivono un metodo random.lognormvariate (mu, sigma):
http://docs.python.org/library/random.html
Forse è quello che vuoi.
Forse puoi usare Python.NET (questo è NON IronPython), consente di accedere a componenti e servizi .NET:
Ivan,
Non abbiamo interesse a tenere chiuse le persone in NMath. Ecco cosa stiamo facendo in NMath.
double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
return ( 0.5 + 0.5 * Erf( t ) );
dove
private static double Erf( double x )
{
return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}
Questo dovrebbe aiutare ...
- Trevor