%使用fitnlm()通过噪声数据拟合非线性模型(单一高斯曲线)。%需要统计和机器学习工具箱,其中包含fitnlm()。%初始化步骤。clc;%清除命令窗口。关闭所有;%关闭所有数字(imtool.除外)清除;删除所有已存在的变量。或者clearvars,如果你想的话。工作空间; % Make sure the workspace panel is showing. format long g; format compact; fontSize = 20; % Create the X coordinates from 0 to 20 every 0.5 units. X = 0 : 0.5 : 20; mu = 10; % Mean, center of Gaussian. sigma = 3; % Standard deviation. % Define function that the X values obey. a = 6 % Arbitrary sample values I picked. b = 35 Y = a + b * exp(-(X - mu) .^ 2 / sigma); % Get a vector. No noise in this Y yet. % Add noise to Y. Y = Y + 2 * randn(1, length(Y)); % Now we have noisy training data that we can send to fitnlm(). % Plot the noisy initial data. plot(X, Y, 'b*', 'LineWidth', 2, 'MarkerSize', 15); grid on; % Convert X and Y into a table, which is the form fitnlm() likes the input data to be in. tbl = table(X(:), Y(:)); % Define the model as Y = a + exp(-b*x) % Note how this "x" of modelfun is related to big X and big Y. % x((:, 1) is actually X and x(:, 2) is actually Y - the first and second columns of the table. modelfun = @(b,x) b(1) + b(2) * exp(-(x(:, 1) - b(3)).^2/b(4)); beta0 = [6, 35, 10, 3]; % Guess values to start with. Just make your best guess. % Now the next line is where the actual model computation is done. mdl = fitnlm(tbl, modelfun, beta0); % Now the model creation is done and the coefficients have been determined. % YAY!!!! % Extract the coefficient values from the the model object. % The actual coefficients are in the "Estimate" column of the "Coefficients" table that's part of the mode. coefficients = mdl.Coefficients{:, 'Estimate'} % Let's do a fit, but let's get more points on the fit, beyond just the widely spaced training points, % so that we'll get a much smoother curve. X = linspace(0, 20, 1920); % Let's use 1920 points, which will fit across an HDTV screen about one sample per pixel. % Create smoothed/regressed data using the model: yFitted = coefficients(1) + coefficients(2) * exp(-(X - coefficients(3)).^2 / coefficients(4)); % Now we're done and we can plot the smooth model as a red line going through the noisy blue markers. hold on; plot(X, yFitted, 'r-', 'LineWidth', 2); grid on; title('Exponential Regression with fitnlm()', 'FontSize', fontSize); xlabel('X', 'FontSize', fontSize); ylabel('Y', 'FontSize', fontSize); legendHandle = legend('Noisy Y', 'Fitted Y', 'Location', 'northeast'); legendHandle.FontSize = 25; % Set up figure properties: % Enlarge figure to full screen. set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]); % Get rid of tool bar and pulldown menus that are along top of figure. % set(gcf, 'Toolbar', 'none', 'Menu', 'none'); % Give a name to the title bar. set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')