2012-11-08 8 views
8

मेरे पास चोटी के साथ आवृत्ति डेटा का एक सेट है जिसमें मुझे गॉसियन वक्र फिट करने की आवश्यकता है और फिर पूर्ण चौड़ाई अधिकतम आधा प्राप्त करें। एफडब्ल्यूएचएम भाग मैं कर सकता हूं, मेरे पास पहले से ही एक कोड है लेकिन मुझे गॉसियन फिट करने के लिए कोड लिखने में परेशानी हो रही है।matlab/octave में डेटा के लिए एक गाऊशियन फिट करने के लिए कैसे?

क्या किसी को भी मेरे लिए ऐसा करने वाले कार्यों के बारे में पता है या मुझे सही दिशा में इंगित करने में सक्षम होंगे? (मैं लाइनों और बहुपदों के लिए कम से कम वर्गों को फिट कर सकता हूं लेकिन मैं इसे गॉसियन के लिए काम नहीं कर सकता)

यह भी उपयोगी होगा अगर यह ऑक्टेव और मैटलैब दोनों के साथ संगत था क्योंकि मेरे पास इस समय ऑक्टेव है लेकिन डॉन अगले सप्ताह तक Matlab तक पहुंच नहीं है।

किसी भी मदद की सराहना की जाएगी!

+0

आप एक ही शिखर (केवल 1 गाऊसी) है? या एकाधिक चोटियों (एकाधिक, ओवरलैपिंग Guassians)? –

+0

यह प्रति फ़ाइल सिर्फ एक ही चोटी है। – user1806676

+1

यदि यह सिर्फ एक चोटी है, तो संख्याओं का औसत और मानक-देव लें और यह आपके नमूना सामान्य वितरण को परिभाषित करता है। क्या आपने कोशिश की है? अन्यथा, यदि आपके पास आंकड़े टूलबॉक्स हैं, तो मानक() का उपयोग करें। – Justin

उत्तर

19

सीधे एक भी -1 डी गाऊसी फिटिंग एक गैर रेखीय फिटिंग समस्या है। आप पहले से तैयार कार्यान्वयन (यदि आप आँकड़े टूलबॉक्स है) मिल जाएगा here, या here, या here for 2D, या here (यदि आप Google में सुना है? :)

वैसे भी, वहाँ एक सरल समाधान हो सकता है।

y = 1/(σ·√(2π)) · exp(-½ ((x-μ)/σ)²) 
ln y = ln(1/(σ·√(2π))) - ½ ((x-μ)/σ)² 
    = Px² + Qx + R   
: आप अपने डेटा y एक गाऊसी द्वारा अच्छी तरह से वर्णित किया जाएगा, और यथोचित अपने पूरे x -range से अधिक अच्छी तरह से वितरित किया जाता निश्चित रूप से पता है, तो आप समस्या (इन समीकरणों कर रहे हैं, बयान नहीं) linearize कर सकते हैं

जहां प्रतिस्थापन

P = -1/(2σ²) 
Q = +2μ/(2σ²)  
R = ln(1/(σ·√(2π))) - ½(μ/σ)² 

बनाया गया है। अब, के साथ रैखिक प्रणाली Ax=b (इन मैटलैब बयान कर रहे हैं) के लिए हल:

% design matrix for least squares fit 
xdata = xdata(:); 
A = [xdata.^2, xdata, ones(size(xdata))]; 

% log of your data 
b = log(y(:));     

% least-squares solution for x 
x = A\b;      

वेक्टर x आप इस तरह से पाया बराबर होगा

x == [P Q R] 

है जिसे आप रिवर्स इंजीनियर को खोजने के लिए मतलब μ और मानक-विचलन σ:

mu = -x(2)/x(1)/2; 
sigma = sqrt(-1/2/x(1)); 

x(3) == R साथ जो तुम कर सकते हैं पार की जाँच (वहाँ केवल होना चाहिए छोटे मतभेद)।

+0

बहुत बहुत धन्यवाद। मैं केवल Google के माध्यम से लिंक का पहला पता लगाने में सक्षम था और वह मेरे डेटा के साथ काम नहीं कर रहा था, दूसरा दूसरा इलाज करता है। स्पष्टीकरण/समीकरणों के लिए भी धन्यवाद। : डी – user1806676

+0

@ user1806676: मैंने रैखिक दृष्टिकोण की कोशिश नहीं की है, लेकिन कम से कम गणित सही है। आपको कुछ प्रयोग और सत्यापन करना चाहिए। –

+0

रैखिक दृष्टिकोण का प्रयास किया। अच्छा काम करता है। –

2

शायद यह वह चीज है जिसे आप ढूंढ रहे हैं? http://www.mathworks.com/matlabcentral/fileexchange/11733-gaussian-curve-fit

इसके प्रलेखन से:: संगतता के बारे में सुनिश्चित नहीं हैं कि

[sigma,mu,A]=mygaussfit(x,y) 
[sigma,mu,A]=mygaussfit(x,y,h) 

this function is doing fit to the function 
y=A * exp(-(x-mu)^2/(2*sigma^2)) 

the fitting is been done by a polyfit 
the lan of the data. 

h is the threshold which is the fraction 
from the maximum y height that the data 
is been taken from. 
h should be a number between 0-1. 
if h have not been taken it is set to be 0.2 
as default. 
+0

टिप्पणी के रूप में बेहतर उपयुक्त, नहीं? –

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/13114204) –

+1

@ScottHoltzman सिर के लिए धन्यवाद, मैंने प्रासंगिक वर्णन शामिल किया है। –

1

मुझे भी इसी तरह की समस्या थी। यह Google पर पहला परिणाम था, और यहां लिखे गए कुछ स्क्रिप्ट्स ने मेरा मैटलैब क्रैश किया।

अंत में मुझे here मिला कि मैटलैब फिट फ़ंक्शन में बनाया गया है, जो गॉसियनों को भी फिट कर सकता है।

यह है कि तरह लग रहे:

>> v=-30:30; 
>> fit(v', exp(-v.^2)', 'gauss1') 

ans = 

    General model Gauss1: 
    ans(x) = a1*exp(-((x-b1)/c1)^2) 
    Coefficients (with 95% confidence bounds): 
     a1 =   1 (1, 1) 
     b1 = -8.489e-17 (-3.638e-12, 3.638e-12) 
     c1 =   1 (1, 1) 
+1

ध्यान दें कि 'फिट' अंतर्निहित नहीं है; यह वक्र फिटिंग टूलबॉक्स का हिस्सा है –

0

मैंने पाया कि MATLAB "फिट" समारोह धीमी थी, और एक इनलाइन गाऊसी समारोह के साथ "lsqcurvefit" का इस्तेमाल किया।यह गॉसियन फ़ंक्शन को फ़िट करने के लिए है, यदि आप केवल सामान्य वितरण में डेटा फिट करना चाहते हैं, तो "मानक" का उपयोग करें।

चेक यह

% % Generate synthetic data (for example) % % % 

    nPoints = 200; binSize = 1/nPoints ; 
    fauxMean = 47 ;fauxStd = 8; 
    faux = fauxStd.*randn(1,nPoints) + fauxMean; % REPLACE WITH YOUR ACTUAL DATA 
    xaxis = 1:length(faux) ;fauxData = histc(faux,xaxis); 

    yourData = fauxData; % replace with your actual distribution 
    xAxis = 1:length(yourData) ; 

    gausFun = @(hms,x) hms(1) .* exp (-(x-hms(2)).^2 ./ (2*hms(3)^2)) ; % Gaussian FUNCTION 

% % Provide estimates for initial conditions (for lsqcurvefit) % % 

    height_est = max(fauxData)*rand ; mean_est = fauxMean*rand; std_est=fauxStd*rand; 
    x0 = [height_est;mean_est; std_est]; % parameters need to be in a single variable 

    options=optimset('Display','off'); % avoid pesky messages from lsqcurvefit (optional) 
    [params]=lsqcurvefit(gausFun,x0,xAxis,yourData,[],[],options); % meat and potatoes 

    lsq_mean = params(2); lsq_std = params(3) ; % what you want 

% % % Plot data with fit % % % 
    myFit = gausFun(params,xAxis); 
    figure;hold on;plot(xAxis,yourData./sum(yourData),'k'); 
    plot(xAxis,myFit./sum(myFit),'r','linewidth',3) % normalization optional 
    xlabel('Value');ylabel('Probability');legend('Data','Fit') 
संबंधित मुद्दे