Pregunta

Necesito portar algunas funciones de C # a Python, pero no puedo implementar el siguiente código a la derecha:

[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);
}

Este código utiliza la biblioteca CenterSpace Nmath.

Cualquiera puede ayudarme a escribir una función correcta en python, ¿cuál será similar a este código?

Lo siento por mi inglés.

UPD En realidad, no entiendo qué elementos scipy.stats.lognorm.cdf son similares a C # probabilidad, media, stddev

Si solo copia la orden existente a Python, como en la respuesta a continuación, obtengo el número incorrecto.

¿Fue útil?

Solución

Scipy tiene un montón de distribuciones definidas en el paquete scipy.stats

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,mean)

Actualizar

Bueno, parece que las definiciones de estadísticas de Scipy son un poco no estándar. Aquí está el final de la cadena de documentación para scipy.stats.lognormal

  

Distribución lognormal

     

lognorm.pdf (x, s) = 1 / (s x sqrt (2 * pi)) * exp (-1 / 2 * (log (x) / s) ** 2 )      para x > 0, s > 0.

     

Si log x se distribuye normalmente con media mu y varianza sigma ** 2,      entonces x es log-distribuido normalmente con shape paramter sigma y escala      parámetro exp (mu).

Así que tal vez intente

return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))

Si eso todavía no funciona, intente obtener algunos puntos de muestra y veré si puedo encontrar una relación de trabajo.

Udpate 2

Vaya, no me di cuenta de que la escala param es una palabra clave. Este debería funcionar ahora:

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))

¡Salud y buena suerte con tu proyecto!

Otros consejos

Los documentos de Python describen un método random.lognormvariate (mu, sigma):

http://docs.python.org/library/random.html

Tal vez eso es lo que quieres.

Tal vez pueda usar Python.NET (esto es NOT IronPython), que permite acceder a los componentes y servicios de .NET:

http://pythonnet.sourceforge.net/

Ivan,

No tenemos ningún interés en mantener a las personas encerradas en NMath. Esto es lo que estamos haciendo en NMath.

  double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
  return ( 0.5 + 0.5 * Erf( t ) );

donde

private static double Erf( double x )
{
  return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}

Eso debería ayudar ...

  • Trevor
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top