2012-01-15 7 views
16

मैं Scipy का उपयोग कर lognormal वितरण का परिणाम प्राप्त करने का प्रयास कर रहा हूं। मेरे पास पहले से ही मुई और सिग्मा है, इसलिए मुझे कोई अन्य काम करने की ज़रूरत नहीं है। अगर मुझे और अधिक विशिष्ट होने की आवश्यकता है (और मैं आंकड़ों के सीमित ज्ञान के साथ रहने की कोशिश कर रहा हूं), तो मैं कहूंगा कि मैं संचयी कार्य (सीसीएफ के तहत सीडीएफ) की तलाश में हूं। समस्या यह है कि मैं यह नहीं समझ सकता कि 0-1 के पैमाने पर केवल माध्य और मानक विचलन के साथ ऐसा कैसे करें (यानी उत्तर लौटाया जाना चाहिए 0-1 से कुछ होना चाहिए)। मुझे यह भी यकीन नहीं है कि dist से कौन सी विधि है, मुझे जवाब प्राप्त करने के लिए उपयोग करना चाहिए। मैंने प्रलेखन पढ़ने और एसओ के माध्यम से देखने की कोशिश की है, लेकिन प्रासंगिक प्रश्न (जैसे this और this) ऐसा लगता है कि मैं जो जवाब ढूंढ रहा था उसे प्रदान नहीं करता था।मैं म्यू और सिग्मा के साथ पाइथन में एक असामान्य वितरण कैसे प्राप्त करूं?

यहां एक कोड नमूना है जिसके साथ मैं काम कर रहा हूं। धन्यवाद।

from scipy.stats import lognorm 
stddev = 0.859455801705594 
mean = 0.418749176686875 
total = 37 
dist = lognorm.cdf(total,mean,stddev) 

अद्यतन:

तो काम का एक सा और एक छोटे से अनुसंधान के बाद, मैं एक छोटे से आगे हो गया। लेकिन मुझे अभी भी गलत जवाब मिल रहा है। नया कोड नीचे है। आर और एक्सेल के अनुसार, परिणाम .7434 होना चाहिए, लेकिन यह स्पष्ट रूप से नहीं हो रहा है कि क्या हो रहा है। क्या कोई तर्क दोष है जो मुझे याद आ रही है?

dist = lognorm([1.744],loc=2.0785) 
dist.cdf(25) # yields=0.96374596, expected=0.7434 

अद्यतन 2: कार्य lognorm कार्यान्वयन जो सही 0.7434 परिणाम अर्जित करता है।

def lognorm(self,x,mu=0,sigma=1): 
    a = (math.log(x) - mu)/math.sqrt(2*sigma**2) 
    p = 0.5 + 0.5*math.erf(a) 
    return p 
lognorm(25,1.744,2.0785) 
> 0.7434 
+1

तुम क्या आप "एक वितरण का नतीजा" के लिए समझते हैं समझा सकता है? – joaquin

+0

@joaquin मैंने एक कोड नमूना जोड़ा जो दिखाता है कि मेरे पास क्या है और मैं इसे क्या उम्मीद करता हूं। –

+0

@EricLubow: मुझे लगता है कि आप इस मामले में क्या मतलब और stddev मतलब गलत समझ सकते हैं।असामान्य वितरण के लिए वे परिवर्तनीय * के लॉगरिदम का माध्य और stddev * हैं। यदि एक चर को असामान्य रूप से वितरित किया जाता है, तो इसका अर्थ यह है कि चर के लॉगरिदम को सामान्य रूप से वितरित किया जाता है। – talonmies

उत्तर

12

ऐसा लगता है जैसे आप ज्ञात मानकों से "जमे हुए" वितरण को तत्काल बनाना चाहते हैं।

from scipy.stats import lognorm 
stddev = 0.859455801705594 
mean = 0.418749176686875 
dist=lognorm([stddev],loc=mean) 

जो आप माध्य और मानक विचलन आपके द्वारा निर्दिष्ट के साथ एक lognorm वितरण वस्तु दे देंगे: अपने उदाहरण में, आप की तरह कुछ कर सकता है।

import numpy as np 
import pylab as pl 
x=np.linspace(0,6,200) 
pl.plot(x,dist.pdf(x)) 
pl.plot(x,dist.cdf(x)) 

lognorm cdf and pdf

यह है कि क्या आपने सोचा था है: आप तो PDF या इस तरह CDF मिल सकता है?

+1

टाइपो: "np.inspace" के बजाय "np.linspace" होना चाहिए –

+0

धन्यवाद, निश्चित। कट और पेस्ट के बाद टाइपो ... – talonmies

+0

यह "dist = lognorm ([stddev ** 2], loc = mean) नहीं होना चाहिए", यानी भिन्नता और मानक विचलन पैरामीटर के रूप में नहीं होना चाहिए? मुझे scipy दस्तावेज़ों में पैरामीटर विनिर्देश नहीं मिला, क्या आप इसके बारे में जानते हैं? –

21

मुझे पता है कि यह थोड़ा देर हो चुकी है (लगभग एक वर्ष!) लेकिन मैं scipy.stats में lognorm फ़ंक्शन पर कुछ शोध कर रहा हूं। बहुत से लोग इनपुट पैरामीटर के बारे में उलझन में लगते हैं, इसलिए मुझे उम्मीद है कि इन लोगों की मदद करें। ऊपर दिया गया उदाहरण लगभग सही है, लेकिन मुझे स्थान ("loc") पैरामीटर के अर्थ को सेट करने के लिए यह अजीब लगता है - यह सिग्नल है कि सीडीएफ या पीडीएफ 'ले ऑफ' नहीं करता है जब तक कि मूल्य माध्य से अधिक न हो। साथ ही, औसत और मानक विचलन तर्क क्रमशः फॉर्म एक्स (एलएन (माध्य)) और एलएन (स्टडीडेव) में होना चाहिए।

सीधे शब्दों में कहें, तर्क, (एक्स, आकार, loc, पैमाने) कर रहे हैं नीचे पैरामीटर परिभाषा के साथ:

loc - कोई बराबर है, यह आपके डेटा से घटाया जाता है ताकि 0 रेंज के infimum हो जाता है डेटा का

स्केल - एक्सपी μ, जहां μ विविधता के लॉग का मतलब है। (फिटिंग करते समय, आमतौर पर आप डेटा के लॉग के नमूना माध्य का उपयोग करेंगे।)

आकार - विविधता के लॉग का मानक विचलन।

मैं इस समारोह के साथ अधिकांश लोगों के समान निराशा से गुजर गया, इसलिए मैं अपना समाधान साझा कर रहा हूं। बस सावधान रहें क्योंकि स्पष्टीकरण संसाधनों के एक सारांश के बिना बहुत स्पष्ट नहीं हैं।

और यहाँ एक उदाहरण है,, @ सर्व-इंक के जवाब से लिया इस पर पोस्ट किया जाता है:

अधिक जानकारी के लिए मैं इन स्रोतों उपयोगी पाया पेज here:

import math 
from scipy import stats 

# standard deviation of normal distribution 
sigma = 0.859455801705594 
# mean of normal distribution 
mu = 0.418749176686875 
# hopefully, total is the value where you need the cdf 
total = 37 

frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu)) 
frozen_lognorm.cdf(total) # use whatever function and value you need here 
+1

देखें यदि मुझे यह सही लगता है: यदि एक्स एन (एमयू, सिग्मा) है तो गणितीय नोटेशन में वाई = एक्स (एक्स) लॉगएन है (एमयू, सिग्मा)। X में scipy प्राप्त करने के लिए मैं मानक (एमयू, सिग्मा) का उपयोग करता हूं लेकिन वाई प्राप्त करने के लिए मैं lognorm (सिग्मा, 0, एक्सपी (एमयू) का उपयोग करता हूं)। यह अजीब है ... –

+1

बीटीडब्लू: मुझे आपकी पोस्ट उपयोगी मिली, लेकिन समझदार मदद नहीं मिली। प्रत्येक वितरण के लिए आपको वास्तव में यह समझना होगा कि पैरामीटर का अर्थ क्या हो सकता है (उदाहरण के लिए समान वितरण यू (ए, बी) के लिए, जहां [ए, बी] अंतराल है जिसे आपको वर्दी की आवश्यकता है (loc = a, scale = बीए), यहां लोक मतलब नहीं है, न ही stddev स्केल करें ...) –

+2

@ एल्मरज़ेंडर: आप 'lognorm (s = sigma, scale = math.exp (mu)' का उपयोग कर सकते हैं। http: // stackoverflow देखें। कॉम/ए/36714419/1587329 –

3

इससे भी अधिक देर हो गई, लेकिन मामले में यह किसी और के लिए उपयोगी है: मैंने पाया है कि एक्सेल के

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE) 

के रूप में अजगर के

from scipy.stats import lognorm 
lognorm.cdf(x,sigma,0,mean) 

इसी तरह, Excel के

LOGNORM.DIST(x,Ln(mean),standard_dev,FALSE) 

लगता बराबर ही परिणाम देता है पाइथन के

from scipy.stats import lognorm 
lognorm.pdf(x,sigma,0,mean). 
+0

पहले मामले के लिए, उन्होंने मेरे लिए एक ही परिणाम नहीं लौटाया जहां x = 2039.9337873, माध्य = 7.6 9 01, std_dev = 0.6772 –

+0

आह, मैं अपने एक्सेल सूत्र में एलएन (माध्य) जोड़ना भूल गया। उत्तर में सुधार – Docuemada

2

@lucas' answer का उपयोग पेट नीचे है। एक कोड उदाहरण के रूप में, आप

import math 
from scipy import stats 

# standard deviation of normal distribution 
sigma = 0.859455801705594 
# mean of normal distribution 
mu = 0.418749176686875 
# hopefully, total is the value where you need the cdf 
total = 37 

frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu)) 
frozen_lognorm.cdf(total) # use whatever function and value you need here 
0

इस्तेमाल कर सकते हैं तो आप इस पढ़ सकते हैं और सिर्फ आर खैर में व्यवहार lnorm के लिए इसी तरह के साथ एक समारोह चाहते हैं, तो हिंसक क्रोध से अपने आप को राहत देने और numpy के numpy.random.lognormal का उपयोग करें।

4
from math import exp 
from scipy import stats 

def lognorm_cdf(x, mu, sigma): 
    shape = sigma 
    loc = 0 
    scale = exp(mu) 
    return stats.lognorm.cdf(x, shape, loc, scale) 

x  = 25 
mu  = 2.0785 
sigma = 1.744 
p  = lognorm_cdf(x, mu, sigma) #yields the expected 0.74341 

एक्सेल और आर की तरह, lognorm_cdf समारोह ऊपर म्यू और सिग्मा का उपयोग कर लॉग-सामान्य वितरण के लिए CDF parameterizes।

हालांकि SciPy आकार, loc और पैमाने पैरामीटर का उपयोग करता मैं यह थोड़ा आसान चर स्तर पर बजाय वितरण में इन मानकों के बारे में सोच करने के लिए लॉग-सामान्य वितरण के लिए, अपने संभाव्यता वितरण चिह्नित करने के लिए स्तर। मेरा मतलब यह है कि ...

एक लॉग-सामान्य चर एक्स एक सामान्य चर जेड से संबंधित है इस प्रकार है:

X = exp(mu + sigma * Z)    #Equation 1 

जो एक ही है के रूप में:

X = exp(mu) * exp(Z)**sigma   #Equation 2 

यह sneakily फिर से किया जा सकता है निम्नानुसार लिखा गया है:

X = exp(mu) * exp(Z-Z0)**sigma  #Equation 3 

जहां र् 0 = 0. यह समीकरण रूप से है:

f(x) = a * ((x-x0) ** b)   #Equation 4 

आप अपने सिर में समीकरणों कल्पना कर सकते हैं, तो यह स्पष्ट किया जाना चाहिए कि पैमाने पर, समीकरण 4 में आकार और स्थान पैरामीटर हैं: एक , बी और x0 क्रमशः। इसका मतलब है कि समीकरण 3 में पैमाने, आकार और स्थान पैरामीटर हैं: exp (mu), सिग्मा और शून्य, सम्मानपूर्वक।

f(Z) = exp(mu) * exp(Z)**sigma  #(same as Equation 2) 

और फिर आगे च (जेड)म्यू और सिग्मा के प्रभाव को देखने के:

आप बहुत स्पष्ट रूप से है कि कल्पना नहीं कर सकते, के एक समारोह के रूप समीकरण 2 पुनर्लेखन जाने । नीचे दिए गए आंकड़े सिग्मा स्थिर हैं और mu बदलता है। आपको यह देखना चाहिए कि mu लंबवत स्केल एफ (जेड)। हालांकि, यह एक nonlinear तरीके से ऐसा करता है; mu 0 से 1 को बदलने का प्रभाव 1 से 2 तक mu बदलने के प्रभाव से छोटा है। समीकरण 2 से हम देखते हैं कि exp (mu) वास्तव में रैखिक स्केलिंग कारक है। इसलिए SciPy का "स्केल" एक्सप (एमयू) है।

effects_of_mu

अगले आंकड़ा म्यू लगातार रखती है और सिग्मा भिन्न होता है। आपको देखना चाहिए कि एफ (जेड) परिवर्तन का आकार बदलना चाहिए। यही है, जब जेड = 0 और सिग्मा को प्रभावित करता है च (जेड) एक निरंतर मूल्य है कितनी जल्दी च (जेड) क्षैतिज अक्ष से घटता दूर। इसलिए SciPy का "आकार" सिग्मा है।

effects_of_sigma

+0

यह बताने की देखभाल करें कि यह सवाल का जवाब क्यों है? – MeanGreen

+0

मुझे पता चला है कि यह मैक्स 1: 1 एक्सेल फ़ंक्शन LOGNORM.DIST (x, Mu, सिग्मा, TRUE) के साथ है। – asdag8

संबंधित मुद्दे