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.

È stato utile?

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:

http://pythonnet.sourceforge.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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top