在数据分析和统计建模中,高斯分布常用于描述自然现象中的随机误差、噪声以及测量数据的分布。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
对于每个组别,我们提取其对应的 x
和 y
数据。若数据点不足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