Pergunta

Eu preciso porta algumas funções de C # para Python, mas eu não posso implementar próxima à direita código:

[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 a biblioteca CenterSpace NMath.

Alguém pode me ajudar a escrever uma função bem em python, que será semelhante a este código?

Sorry for my Inglês.

UPD Na verdade, eu não entendo o que scipy.stats.lognorm.cdf attrs são simillar para C # probabilidade, média, o desvio-padrão

Se apenas copiar ordem existente para python, como em resposta abaixo, eu recebo número errado.

Foi útil?

Solução

Scipy tem um grupo de distribuições definidos no pacote scipy.stats

import scipy.stats

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

Atualização

Ok, parece que as definições de estatísticas da SciPy são um pouco fora do padrão. Aqui é o fim do docstring para scipy.stats.lognormal

distribuição Lognormal

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

Se o log x é normalmente distribuído com mu média e variância sigma ** 2, então x é log normalmente distribuída-sigma com forma paramter e escala parâmetro exp (mu).

Então, talvez tente

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

Se isso ainda não funcionar, tente obter alguns pontos de amostragem e eu vou ver se eu posso encontrar uma relação de trabalho.

UDPATE 2

Opa, eu não perceber que o param escala é uma palavra-chave. Este deve agora trabalho:

import scipy.stats

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

Felicidades e boa sorte com seu projeto!

Outras dicas

Os documentos Python descrever um método random.lognormvariate (mu, Sigma):

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

Talvez seja isso que você quer.

Talvez você possa usar Python.NET (isto é não IronPython), permite acessar os componentes e serviços NET:

http://pythonnet.sourceforge.net/

Ivan,

Nós temos nenhum interesse em manter as pessoas trancadas em NMath. Aqui está o que estamos fazendo em NMath.

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

onde

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

Isso deve ajudar ...

  • Trevor
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top