C # Nmath to Python SciPy
Question
Je dois porter certaines fonctions de C # vers Python, mais je ne peux pas implémenter le code suivant à droite:
[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);
}
Ce code utilise la bibliothèque CenterSpace Nmath.
Tout le monde peut m'aider à écrire une fonction correcte en python, qui ressemblera à ce code?
Désolé pour mon anglais.
UPD En fait, je ne comprends pas quels attributs scipy.stats.lognorm.cdf sont identiques à la probabilité C #, moyenne, stddev
Si vous copiez simplement l'ordre existant sur python, comme dans la réponse ci-dessous, j'obtiens un mauvais numéro.
La solution
Scipy a un tas de distributions définies dans le paquet scipy.stats
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,mean)
Mettre à jour
D'accord, il semblerait que les définitions de statistiques de Scipy soient un peu non standard. Voici la fin de la docstring pour scipy.stats.lognormal
Distribution log-normale
lognorm.pdf (x, s) = 1 / (s x sqrt (2 * pi)) * exp (-1 / 2 * (log (x) / s) ** 2 ) pour x > 0, s > 0.
Si log x est normalement distribué avec mu moyen et variance sigma ** 2, alors x est log-normalement distribué avec le paramètre de forme sigma et l'échelle paramètre exp (mu).
Alors peut-être essayer
return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))
Si cela ne fonctionne toujours pas, essayez quelques exemples de points et je verrai si je peux trouver une relation de travail.
Udpate 2
Oups, je n'avais pas réalisé que le paramètre scale était un mot clé. Celui-ci devrait maintenant fonctionner:
import scipy.stats
def LogNormDist(prob, mean=0, stddev=1):
return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))
Salut et bonne chance dans votre projet!
Autres conseils
Les documents Python décrivent une méthode random.lognormvariate (mu, sigma):
http://docs.python.org/library/random.html
Peut-être que c'est ce que vous voulez.
Peut-être pouvez-vous utiliser Python.NET (ceci est PAS IronPython), cela permet d'accéder aux composants et services .NET:
Ivan,
Nous n'avons aucun intérêt à garder les gens bloqués dans NMath. Voici ce que nous faisons à NMath.
double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
return ( 0.5 + 0.5 * Erf( t ) );
où
private static double Erf( double x )
{
return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}
Cela devrait aider ...
- Trevor