在MATLAB中实现高斯拟合通常涉及使用高斯函数来拟合数据集。对于二维高斯拟合,可以使用fit
函数和自定义的高斯模型。然而,将一个二维高斯分布转换为两个一维高斯分布并不总是直接可行,因为二维高斯分布可能包含项,这些项在两个一维高斯中不能简单对应。如果二维高斯分布是可分离的(即没有交叉项),那么可以分别对x和y方向进行拟合。
二维高斯函数拟合
先介绍如何在MATLAB中进行二维高斯拟合:
% 二维高斯函数
gaussian2D = @(b, x) b(1)*exp(-((x(:,1)-b(2)).^2/(2*b(4)^2) + (x(:,2)-b(3)).^2/(2*b(5)^2)));
% 示例数据生成(您应该使用自己的数据)
[x, y] = meshgrid(-10:0.5:10, -10:0.5:10);
z = gaussian2D([1, 0, 0, 2, 3], [x(:), y(:)]);
z = reshape(z, size(x)) + randn(size(x))*0.05; % 加入噪声
% 拟合模型
[beta,~,~] = nlinfit([x(:), y(:)], z(:), gaussian2D, [1, 0, 0, 2, 3]);
% 绘制拟合结果
figure;
surf(x, y, z);
hold on;
z_fit = gaussian2D(beta, [x(:), y(:)]);
z_fit = reshape(z_fit, size(x));
surf(x, y, z_fit);
hold off;
仿真结果:
将二维高斯分解为一维高斯
如果二维高斯分布是可分离的(即协方差矩阵是对角的),可以分别沿每个维度提取一维高斯分布。下面的代码展示了如何从二维高斯参数中提取两个一维高斯分布的参数:
% 提取二维高斯的参数
amp = beta(1);
mean_x = beta(2);
mean_y = beta(3);
std_x = beta(4);
std_y = beta(5);
% 一维高斯函数
gaussian1D = @(a, b, c, x) a * exp(-(x - b).^2 / (2 * c^2));
% 在x和y方向上的一维高斯
gauss_x = gaussian1D(amp, mean_x, std_x, x(1,:));
gauss_y = gaussian1D(amp, mean_y, std_y, y(:,1));
% 绘制一维高斯
figure;
plot(x(1,:), gauss_x);
xlabel('X');
ylabel('Gaussian Amplitude');
title('一维高斯 - X方向');
figure;
plot(y(:,1), gauss_y);
xlabel('Y');
ylabel('Gaussian Amplitude');
title('一维高斯 - Y方向');
仿真结果: