matlab实现高斯拟合

        在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方向');

仿真结果:

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值