C # NMath para Python SciPy
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.
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:
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