生成高斯分布轮廓的matlab程序
时间: 2023-11-03 12:59:39 浏览: 72
好的,我可以帮您回答这个问题。以下是一个生成高斯分布轮廓的Matlab程序示例:
```matlab
% 定义均值、标准差和网格大小
mu = [0 0];
sigma = [1 0.5; 0.5 2];
gridSize = 100;
% 生成网格坐标
x1 = linspace(-3, 3, gridSize);
x2 = linspace(-3, 3, gridSize);
[X1, X2] = meshgrid(x1, x2);
X = [X1(:) X2(:)];
% 计算高斯分布概率密度函数的值
y = mvnpdf(X, mu, sigma);
% 将概率密度函数值重塑成网格形式
Y = reshape(y, gridSize, gridSize);
% 绘制高斯分布轮廓
contour(X1, X2, Y);
```
希望这个程序对您有帮助!如果您有其他问题,请随时问我。
相关问题
高斯混合分布matlab
在Matlab中,可以通过`gmdistribution`函数创建高斯混合分布对象,然后使用该对象进行相关操作,例如生成样本、计算概率密度函数等。以下是一个简单的示例代码:
```matlab
% 创建高斯混合分布对象
mu = [1 2; 4 5; 7 8];
sigma = cat(3, [2 0; 0 .5], [1 0; 0 1], [2 0; 0 2]);
p = [0.2 0.3 0.5];
gm = gmdistribution(mu, sigma, p);
% 生成1000个样本
rng(1); % 设置随机数种子,保证结果可重复
X = random(gm, 1000);
% 绘制样本散点图和高斯分布轮廓线
figure;
scatter(X(:,1), X(:,2), '.');
hold on;
ezcontour(@(x,y)pdf(gm,[x y]), [min(X(:,1))-1 max(X(:,1))+1 min(X(:,2))-1 max(X(:,2))+1]);
title('Gaussian Mixture Distribution');
```
该代码首先创建了一个包含3个高斯分布的混合分布对象`gm`,每个高斯分布的均值、协方差矩阵和权重分别由`mu`、`sigma`和`p`指定。然后使用`random`方法生成1000个样本,并通过`scatter`函数绘制散点图。最后,使用`ezcontour`函数绘制高斯分布轮廓线。结果如下图所示:
![高斯混合分布示例](https://img-blog.csdn.net/20180527223413194?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RldmVsb3Blcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
EM算法计算混合高斯分布的matlab代码
以下是使用EM算法计算混合高斯分布的MATLAB代码示例:
```matlab
% 设置参数
K = 2; % 混合高斯分布中高斯分布的个数
N = 500; % 样本数量
D = 2; % 样本特征维度
% 生成样本
mu_true = [1 2;-2 -3]; % 真实高斯分布的均值
sigma_true = cat(3,[2 0;0 0.5],[0.5 0;0 1]); % 真实高斯分布的协方差矩阵
alpha_true = [0.4,0.6]; % 真实高斯分布的权重
x = zeros(N,D);
for i = 1:N
k = randi(K);
x(i,:) = mvnrnd(mu_true(k,:),sigma_true(:,:,k));
end
% EM算法计算混合高斯分布
alpha = ones(1,K)./K; % 初始化高斯分布的权重
mu = rand(K,D).*range(x)+min(x); % 初始化高斯分布的均值
sigma = repmat(eye(D),[1,1,K]); % 初始化高斯分布的协方差矩阵
gamma = zeros(N,K); % 初始化样本属于每个高斯分布的后验概率
log_likelihood = -inf; % 初始化对数似然函数值
for iter = 1:100
% E步:计算样本属于每个高斯分布的后验概率
for k = 1:K
gamma(:,k) = alpha(k)*mvnpdf(x,mu(k,:),sigma(:,:,k));
end
gamma = gamma./sum(gamma,2);
% M步:更新高斯分布的参数
Nk = sum(gamma,1);
alpha = Nk./N;
mu = gamma'*x./Nk';
for k = 1:K
x_centered = x-mu(k,:);
sigma(:,:,k) = x_centered'*diag(gamma(:,k))*x_centered./Nk(k);
end
% 计算对数似然函数值
log_likelihood_new = sum(log(sum(gamma.*repmat(alpha,[N,1]),2)));
if abs(log_likelihood_new-log_likelihood) < 1e-6 % 判断收敛
break;
end
log_likelihood = log_likelihood_new;
end
% 可视化结果
figure;
scatter(x(:,1),x(:,2),10,gamma(:,1),'filled');
hold on;
scatter(mu(:,1),mu(:,2),50,'k','filled');
contour(mu_true(:,1),mu_true(:,2),mvnpdf([xx(:),yy(:)],mu_true(1,:),sigma_true(:,:,1)),[0.1,0.5,0.9],'k');
contour(mu_true(:,1),mu_true(:,2),mvnpdf([xx(:),yy(:)],mu_true(2,:),sigma_true(:,:,2)),[0.1,0.5,0.9],'k');
title('EM算法计算混合高斯分布');
xlabel('x_1');
ylabel('x_2');
legend('数据','高斯分布均值','真实高斯分布1','真实高斯分布2');
```
其中,`mu_true`、`sigma_true`和`alpha_true`为真实的高斯分布的参数,`x`为生成的样本数据。在算法计算完成后,可以绘制样本数据和计算出的高斯分布的均值,以及真实高斯分布的轮廓线,以便比较它们的相似性。
阅读全文