2012-01-02 2 views
4

로그 정규 분포에 일부 데이터를 맞추려고하고 있으며 이로부터 최적화 된 매개 변수를 사용하여 임의의 로그 정규 분포를 생성합니다. 일부 검색 후 I 일부 솔루션을 찾았지만 설득력 없음 :은 관찰 된 데이터의 모양을 사용하여 임의의 로그 정규 분포를 생성합니다.

solution1 적합성 함수 사용 :

import numpy as np 
from scipy.stats  import lognorm 

mydata = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,8,8,8,8,8,9,9,9,10,10,11,12,13,14,14,15,19,19,21,23,25,27,28,30,31,36,41,45,48,52,55,60,68,75,86,118,159,207,354] 

shape, loc, scale = lognorm.fit(mydata) 
rnd_log = lognorm.rvs (shape, loc=loc, scale=scale, size=100) 

또는 용액 2는 원래의 데이터로부터 MU 시그마 사용 :

import numpy as np 
from scipy.stats  import lognorm 

mydata = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,8,8,8,8,8,9,9,9,10,10,11,12,13,14,14,15,19,19,21,23,25,27,28,30,31,36,41,45,48,52,55,60,68,75,86,118,159,207,354] 

mu = np.mean([np.log(i) for i in mydata]) 
sigma = np.std([np.log(i) for i in mydata]) 

distr = lognorm(mu, sigma) 
rnd_log = distr.rvs (size=100) 

이러한 솔루션 중 어느 것도 적합하지 않습니다.

,753,993,

내가 잘 분포를 사용하는 방법을 이해하고 있는지 확실하지 않다, 또는 뭔가 다른 말이냐하면 ...

그래도 난 여기 해결책을 찾는 : Does anyone have example code of using scipy.stats.distributions? 하지만 난 모양을 얻을 수 아니다 내 데이터에서 ... 나는 fit 함수의 사용에있어서 뭔가를 놓치고 있습니까?

감사

편집 :

print 'solution 1:' 
means = [] 
stdes = [] 
distr = lognorm(mu, sigma) 
for _ in xrange(1000): 
    rnd_log = distr.rvs (size=100) 
    means.append (np.mean([np.log(i) for i in rnd_log])) 
    stdes.append (np.std ([np.log(i) for i in rnd_log])) 
print 'observed mean:',mu , 'mean simulated mean:', np.mean (means) 
print 'observed std :',sigma, 'mean simulated std :', np.mean (stdes) 

print '\nsolution 2:' 
means = [] 
stdes = [] 
shape, loc, scale = lognorm.fit(mydata) 
for _ in xrange(1000): 
    rnd_log = lognorm.rvs (shape, loc=loc, scale=scale, size=100) 
    means.append (np.mean([np.log(i) for i in rnd_log])) 
    stdes.append (np.std ([np.log(i) for i in rnd_log])) 
print 'observed mean:',mu , 'mean simulated mean:', np.mean (means) 
print 'observed std :',sigma, 'mean simulated std :', np.mean (stdes) 

결과는 다음과 같습니다 :

solution 1: 
observed mean: 1.82562655734 mean simulated mean: 1.18929982267 
observed std : 1.39003773799 mean simulated std : 0.88985924363 

solution 2: 
observed mean: 1.82562655734 mean simulated mean: 4.50608084668 
observed std : 1.39003773799 mean simulated std : 5.44206119499 
이 순서 더 내 문제를 이해하기에 예입니다

내가 R에 동일한 작업을 수행하는 경우

동안은 :

mydata <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,8,8,8,8,8,9,9,9,10,10,11,12,13,14,14,15,19,19,21,23,25,27,28,30,31,36,41,45,48,52,55,60,68,75,86,118,159,207,354) 
meanlog <- mean(log(mydata)) 
sdlog <- sd(log(mydata)) 
means <- c() 
stdes <- c() 
for (i in 1:1000){ 
    rnd.log <- rlnorm(length(mydata), meanlog, sdlog) 
    means <- c(means, mean(log(rnd.log))) 
    stdes <- c(stdes, sd(log(rnd.log))) 
} 

print (paste('observed mean:',meanlog,'mean simulated mean:',mean(means),sep=' ')) 
print (paste('observed std :',sdlog ,'mean simulated std :',mean(stdes),sep=' ')) 

내가 얻을 :

[1] "observed mean: 1.82562655733507 mean simulated mean: 1.82307191072317" 
[1] "observed std : 1.39704049131865 mean simulated std : 1.39736545866904" 
훨씬 더 가까운

, 그래서 scipy를 사용할 때 내가 뭔가 잘못하고있는 중이 야 같아요. ..

+1

무엇 이 mydata 배열입니까? 피팅의 경우 x 값과 y 값을 볼 수 있습니다 ...이 배열을 어떻게 해석해야합니까? – Tanriol

+0

[로그 정규 분포에 대한 매개 변수 추정에 관한 많은 논문] (http://scholar.google.com/scholar?q=lognormal+parameter+estimation&hl=en&as_sdt=0&as_vis=1&oi=scholart) 중 어느 것을 보았습니까? –

+0

오케이, 미안 해요, 제 질문이 충분하지 않다고 생각합니다. 나는 그것을 편집한다. – fransua

답변

4

scipy의 대수 정규 분포는 일반적인 방법과 약간 다릅니다. scipy.stats.lognorm 문서, 특히 "메모"섹션을 참조하십시오.

In [315]: from scipy import stats 

In [316]: x = np.array([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,8,8,8,8,8,9,9,9,10,10,11,12,13,14,14,15,19,19,21,23,25,27,28,30,31,36,41,45,48,52,55,60,68,75,86,118,159,207,354]) 

In [317]: mu, sigma = stats.norm.fit(np.log(x)) 

In [318]: mu, sigma 
Out[318]: (1.8256265573350701, 1.3900377379913127) 

In [319]: shape, loc, scale = stats.lognorm.fit(x, floc=0) 

In [320]: np.log(scale), shape 
Out[320]: (1.8256267737298788, 1.3900309739954713) 

지금 당신이 샘플을 생성 할 수 있으며, 여러분의 기대 확인 :

여기 (우리는 피팅 0으로 위치를 잡아 주) 당신이 기다리고있어 결과를 얻을하는 방법

In [321]: dist = stats.lognorm(shape, loc, scale) 

In [322]: means, sds = [], [] 

In [323]: for i in xrange(1000): 
    .....:  sample = dist.rvs(size=100) 
    .....:  logsample = np.log(sample) 
    .....:  means.append(logsample.mean()) 
    .....:  sds.append(logsample.std()) 
    .....: 

In [324]: np.mean(means), np.mean(sds) 
Out[324]: (1.8231068508345041, 1.3816361818739145) 
+0

위대한 !! 고마워요!예, 나는 의사의 메모를 보았습니다. 그러나 그것은 여전히 ​​분명하지 않았습니다. 당신이 영향력을 행사할 수 있는지 모르겠지만, 의사와 같은 예가 나와 같은 초보자에게 도움이 될 것입니다. :). 맨 마지막에 random.lognormvariate (mu, sigma)를 사용하는 다른 솔루션을 찾았지만, 이것은 확실히 더 좋습니다! – fransua

관련 문제