MATLAB拟合算法:如何使用 MATLAB 进行多组数据的高斯拟合分析

发布于:2025-02-19 ⋅ 阅读:(23) ⋅ 点赞:(0)

在数据分析和统计建模中,高斯分布常用于描述自然现象中的随机误差、噪声以及测量数据的分布。MATLAB 提供了强大的数据拟合功能,可以帮助我们对数据进行高斯拟合。本文将演示如何对多组数据分别进行高斯拟合,并输出拟合结果以及拟合曲线的可视化。文件格式为:第一列:组别(若仅有一组就全设置为1),第二、三列:x、y。

步骤 1:导入数据并进行预处理

首先,我们需要从 Excel 文件中导入数据,并进行初步的清理和组织。在本例中,我们使用了一个名为 拟合1.xlsx 的文件。

close all
% 导入数据
data = readtable('拟合1.xlsx', 'ReadVariableNames', false);
data.Properties.VariableNames = {'Group', 'x', 'y'};
data = rmmissing(data); % 删除缺失值

这里,readtable 函数用于读取 Excel 文件,'ReadVariableNames', false 表示文件没有表头。然后,我们重命名数据表中的列,以便后续操作。最后,rmmissing 函数用于删除数据中的缺失值。

步骤 2:获取唯一的组别

数据中可能包含多个组别,我们使用 unique 函数提取唯一的组别ID。

% 获取唯一组别
groups = unique(data.Group);

这样,我们便可以对每个组别进行单独的分析。

步骤 3:遍历组别进行高斯拟合

接下来,我们需要为每个组别的数据进行高斯拟合。在进行拟合之前,我们检查每个组别的数据点数量,确保数据足够拟合。

% 遍历每个组别进行拟合
for i = 1:length(groups)
    groupID = groups(i);
    groupData = data(data.Group == groupID, :);
    x = groupData.x;
    y = groupData.y;
    
    % 检查数据点数
    if numel(x) < 3
        fprintf('组别 %d 数据不足,需至少3个点,已跳过。\n', groupID);
        continue;
    end

对于每个组别,我们提取其对应的 xy 数据。若数据点不足3个,则跳过该组别的拟合。

步骤 4:进行高斯拟合

我们使用 MATLAB 中的 fit 函数来进行高斯拟合。此函数支持多种拟合模型,'gauss1' 表示单峰高斯分布。

    % 高斯拟合
    try
        [fitResult, gof] = fit(x, y, 'gauss1');
        
        % 提取参数
        a = fitResult.a1;
        b = fitResult.b1;
        c = fitResult.c1;
        sigma = c / sqrt(2);
        
        % 计算R²
        r2 = gof.rsquare;
        
        % 输出结果
        fprintf('组别: %d\n', groupID);
        fprintf('振幅: %.2f, 均值: %.2f, 标准差: %.2f\n', a, b, sigma);
        fprintf('R²: %.4f\n\n', r2);

fit 函数返回的 fitResult 包含拟合曲线的参数,其中 a 为振幅,b 为均值,c 为曲线的宽度(与标准差相关)。标准差 sigma 可以通过 c/sqrt(2) 来计算。gof 包含拟合优度(Goodness of Fit)的相关信息,gof.rsquare 提供了 R² 值。

步骤 5:绘制拟合结果

拟合完成后,我们可以绘制原始数据和拟合曲线的图形,直观地查看拟合效果。

        % 可视化
        figure;
        scatter(x, y, 'filled', 'DisplayName', '原始数据');
        hold on;
        xFit = linspace(min(x), max(x), 100)'; % 生成拟合曲线的x数据
        yFit = fitResult(xFit); % 计算拟合曲线的y数据
        plot(xFit, yFit, 'r-', 'LineWidth', 2, 'DisplayName', '拟合曲线');
        title(sprintf('组别 %d: 正态分布拟合 (R²=%.3f)', groupID, r2));
        xlabel('x');
        ylabel('y');
        legend('Location', 'best');
        grid on;
    catch ME
        fprintf('组别 %d 拟合失败: %s\n', groupID, ME.message);
    end
end

在图中,我们使用了 scatter 函数绘制原始数据点,plot 函数绘制拟合曲线。linspace 用来生成一组平滑的 x 数据,从而生成拟合曲线。

步骤 6:异常处理

为了确保程序的稳定性,我们使用 try-catch 语句捕捉拟合过程中的异常。如果拟合失败,程序会输出错误信息,并跳过当前组别。

catch ME
    fprintf('组别 %d 拟合失败: %s\n', groupID, ME.message);
end
总结

通过这段 MATLAB 代码,我们能够对多个组别的数据进行高斯拟合,提取拟合参数(振幅、均值、标准差),并生成拟合曲线的可视化图。R² 值作为拟合优度的一个指标,帮助我们评估拟合的质量。

在实际应用中,这种高斯拟合可以广泛应用于信号处理、统计分析、物理实验数据分析等领域。

完整代码:

close all
% 导入数据
data = readtable('拟合1.xlsx', 'ReadVariableNames', false);
data.Properties.VariableNames = {'Group', 'x', 'y'};
data = rmmissing(data); % 删除缺失值

% 获取唯一组别
groups = unique(data.Group);

% 遍历每个组别进行拟合
for i = 1:length(groups)
    groupID = groups(i);
    groupData = data(data.Group == groupID, :);
    x = groupData.x;
    y = groupData.y;
    
    % 检查数据点数
    if numel(x) < 3
        fprintf('组别 %d 数据不足,需至少3个点,已跳过。\n', groupID);
        continue;
    end
    
    % 高斯拟合
    try
        [fitResult, gof] = fit(x, y, 'gauss1');
        
        % 提取参数
        a = fitResult.a1;
        b = fitResult.b1;
        c = fitResult.c1;
        sigma = c / sqrt(2);
        
        % 计算R²
        r2 = gof.rsquare;
        
        % 输出结果
        fprintf('组别: %d\n', groupID);
        fprintf('振幅: %.2f, 均值: %.2f, 标准差: %.2f\n', a, b, sigma);
        fprintf('R²: %.4f\n\n', r2);
        
        % 可视化
        figure;
        scatter(x, y, 'filled', 'DisplayName', '原始数据');
        hold on;
        xFit = linspace(min(x), max(x), 100)';
        yFit = fitResult(xFit);
        plot(xFit, yFit, 'r-', 'LineWidth', 2, 'DisplayName', '拟合曲线');
        title(sprintf('组别 %d: 正态分布拟合 (R²=%.3f)', groupID, r2));
        xlabel('x');
        ylabel('y');
        legend('Location', 'best');
        grid on;
        
    catch ME
        fprintf('组别 %d 拟合失败: %s\n', groupID, ME.message);
    end
end


网站公告

今日签到

点亮在社区的每一天
去签到