2012-11-08 43 views
8

Tôi có một tập hợp các dữ liệu tần số với các đỉnh mà tôi cần để phù hợp với một đường cong Gaussian và sau đó nhận được chiều rộng tối đa một nửa chiều rộng từ. Phần FWHM tôi có thể làm, tôi đã có một mã cho điều đó nhưng tôi gặp khó khăn khi viết mã để phù hợp với Gaussian.Làm thế nào để phù hợp với một gaussian dữ liệu trong MATLAB/octave?

Có ai biết về bất kỳ chức năng nào sẽ thực hiện việc này cho tôi hoặc có thể chỉ cho tôi đúng hướng không? (Tôi có thể làm ít nhất hình vuông phù hợp cho đường và đa thức nhưng tôi không thể làm cho nó hoạt động cho gaussians)

Ngoài ra nó sẽ hữu ích nếu nó tương thích với cả Octave và Matlab như tôi có Octave tại thời điểm này nhưng don không có quyền truy cập vào Matlab cho đến tuần tới.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

Bạn có một đỉnh cao duy nhất (chỉ có 1 Gaussian)? Hoặc nhiều đỉnh (nhiều, chồng chéo Guassians)? –

+0

Nó chỉ là một đỉnh trên mỗi tệp. – user1806676

+1

Nếu nó chỉ là một đỉnh, lấy giá trị trung bình và tiêu chuẩn của các số và xác định phân bố chuẩn của mẫu của bạn. Bạn đã thử chưa Nếu không, nếu bạn có hộp công cụ thống kê, hãy sử dụng normfit(). – Justin

Trả lời

19

Lắp một 1D Gaussian đơn trực tiếp là một vấn đề phù hợp phi tuyến tính. Bạn sẽ tìm thấy triển khai làm sẵn here, hoặc here, hoặc here for 2D, hoặc here (nếu bạn có số liệu thống kê hộp công cụ) (bạn đã nghe nói về Google? :)

Dù sao, có thể có một giải pháp đơn giản hơn. Nếu bạn biết chắc chắn dữ liệu của bạn sẽ được y cũng được mô tả bởi một Gaussian, và được khá tốt phân phối trên toàn bộ x trung cấp, bạn có thể linearize vấn đề (đây là những phương trình, không báo cáo):

y = 1/(σ·√(2π)) · exp(-½ ((x-μ)/σ)²) 
ln y = ln(1/(σ·√(2π))) - ½ ((x-μ)/σ)² 
    = Px² + Qx + R   

nơi thay thế

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

đã được thực hiện. Bây giờ, giải quyết cho các hệ thống tuyến tính Ax=b với (đây là những Matlab báo cáo):

% 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;      

Các vector x bạn tìm thấy cách này sẽ tương đương với

x == [P Q R] 

mà sau đó bạn phải đảo ngược-kỹ sư để tìm ra có nghĩa là μ và độ lệch chuẩn σ:

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

Bạn có thể kiểm tra chéo với x(3) == R (chỉ nên có nhỏ sự khác biệt).

+0

Cảm ơn rất nhiều. Tôi chỉ có thể tìm thấy đầu tiên của các liên kết thông qua google và đó không phải là làm việc với dữ liệu của tôi, thứ hai làm việc một điều trị mặc dù. Cũng nhờ lời giải thích/phương trình. : D – user1806676

+0

@ user1806676: Tôi chưa thử phương pháp tuyến tính hóa, nhưng ít nhất toán học là chính xác. Bạn nên làm một số thử nghiệm và xác nhận ở đó. –

+0

Đã thử phương pháp tuyến tính hóa. Hoạt động tốt. –

2

Có lẽ điều này có điều bạn đang tìm kiếm? Không chắc chắn về khả năng tương thích: http://www.mathworks.com/matlabcentral/fileexchange/11733-gaussian-curve-fit

Từ tài liệu của nó:

[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

Phù hợp hơn làm nhận xét, phải không? –

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/13114204) –

+1

@ScottHoltzman Cảm ơn bạn đã đứng đầu, tôi đã bao gồm các mô tả có liên quan. –

1

tôi có vấn đề tương tự. đây là kết quả đầu tiên trên google và một số tập lệnh được liên kết ở đây đã làm hỏng sự cố MATLAB của tôi.

cuối cùng tôi tìm thấy here rằng MATLAB đã được xây dựng trong chức năng phù hợp, có thể phù hợp với Gaussians quá.

nó trông như thế:

>> 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

Lưu ý rằng 'fit' không được tích hợp sẵn; nó là một phần của hộp công cụ phù hợp với đường cong –

0

tôi phát hiện ra rằng MATLAB "phù hợp với" chức năng còn chậm, và sử dụng "lsqcurvefit" với một hàm Gauss inline.Điều này là để phù hợp với một CHỨC NĂNG Gaussian, nếu bạn chỉ muốn phù hợp với dữ liệu để phân phối Bình thường, hãy sử dụng "normfit".

Kiểm tra nó

% % 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') 
Các vấn đề liên quan