Matlab到Python Stat Equation

时间:2013-11-11 18:50:09

标签: python matlab image-processing statistics

我想知道是否有人可以帮我将以下代码从MatLab翻译成Python。该方程用于确定截断正态分布的99%置信区间。

function sigma = var_truncNormal( a, b, mu, sigma, data )

x1 = (a-mu)/sigma * normpdf( a, mu, sigma );
x2 = (b-mu)/sigma * normpdf( b, mu, sigma );

cx = normcdf( b, mu, sigma) - normcdf( a, mu, sigma );

yhat = var( data(data>(mu-3000)&data<(mu+3000)) );
sigma2 = yhat/((1+(x1-x2)/cx - ((x1-x2)/cx)^2));
sigma = sqrt( sigma2 );

return;


function ci99 = GetCI99( data )

mu = median( data );
sigma = std( data );
fprintf( 1, 'initial sigma = %.1f\n', sigma );
sigma = var_truncNormal( mu-3000, mu+3000, mu, sigma, data );
fprintf( 1, 'updated sigma = %.1f\n', sigma );
sigma = var_truncNormal( mu-3000, mu+3000, mu, sigma, data );
fprintf( 1, 'updated sigma = %.1f\n', sigma );

ci99 = 2*mu-norminv( 0.01, mu, sigma );

figure( 'visible', 'off' );
hist( data, 5000:200:20000 );
axis( [5000 35000 0 550] );

hold;
[n2, xx] = ksdensity( data, 'npoints', 100 );
plot( xx, n2*length(data)*200, 'r' );

hdl = plot( xx, normpdf( xx, mu, sigma )*length(data)*200, 'k' );
set( hdl, 'linewidth', 2 );

line( [ci99 ci99], [0 550] );

print( '-dpdf', 'testFigure' );
close;

return;

我将不胜感激。

2 个答案:

答案 0 :(得分:0)

我想你会很高兴从matlab到python / numpy。你只需要逐行完成它。

例如你的函数的第一行:

x1 =(a-mu)/ sigma * normpdf(a,mu,sigma);

python中的normpdf是:1 /(sigma * sqrt(2 * pi)) exp(-1 (a-mu)** 2/2 * sigma ** 2)。< / p>

所以我们可以在python中定义一个小函数:

a = numpy.array([3,4,5,2,2,2,1,3,3,3,3])
mu = 3.1
sigma = .7
def normpdf_python(x, mu, sigma):
   return 1/(sigma*sqrt(2*pi))*exp(-1*(x-mu)**2/2*sigma**2)

x1 = (a-mu)/sigma*normpdf_python(a,mu,sigma)

Numpy / Scipy拥有一套深入的统计软件包,您应该始终检查执行所需功能的预先存在的功能。在这种情况下,http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html#scipy.stats.norm pdf(x,loc = 0,scale = 1)接近,但可能不够,因为它被定义为:

norm.pdf(x) = exp(-x**2/2)/sqrt(2*pi)

答案 1 :(得分:0)

正确的公式是:

def normpdf_python(x, mu, sigma):
   return 1/(sigma*np.sqrt(2*np.pi))*np.exp(-1*(x-mu)**2/ (2*sigma**2) )

你忘记了(2 * sigma ** 2)

中的括号

btw:norm.pdf(x,loc,scale)产生相同的