matlab通过mvnpdf计算混合高斯分布的代码
时间: 2023-12-03 13:02:40 浏览: 120
假设你已经有了混合高斯模型的参数:均值向量、协方差矩阵和混合系数。现在需要计算一个给定数据点的概率密度,可以使用 `mvnpdf` 函数。
以下是示例代码:
```matlab
% 模型参数
mu = [1 2; 4 5];
sigma = cat(3, [2 0; 0 .5], [1 0; 0 1]);
p = [0.6 0.4];
% 需要计算概率密度的数据点
x = [2 3; 5 6];
% 计算概率密度
pdf = p(1)*mvnpdf(x, mu(1,:), sigma(:,:,1)) + ...
p(2)*mvnpdf(x, mu(2,:), sigma(:,:,2));
```
这里 `mu` 是一个二维矩阵,每行表示一个高斯分布的均值向量;`sigma` 是一个三维矩阵,每个二维矩阵表示一个高斯分布的协方差矩阵,第三维表示高斯分布的数量;`p` 是一个向量,表示每个高斯分布的混合系数;`x` 是一个二维矩阵,每行表示一个待计算概率密度的数据点。
`mvnpdf` 函数的第一个参数是待计算概率密度的数据点,第二个参数是高斯分布的均值向量,第三个参数是高斯分布的协方差矩阵。
相关问题
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`为生成的样本数据。在算法计算完成后,可以绘制样本数据和计算出的高斯分布的均值,以及真实高斯分布的轮廓线,以便比较它们的相似性。
如何通过mvnpdf计算第i个高斯分布的概率
假设你有一个混合高斯模型,其中包含k个高斯分布。第i个高斯分布的概率可以使用MATLAB中的mvnpdf函数计算。该函数需要以下输入参数:
- X:n x d的矩阵,其中n是样本数,d是每个样本的特征数。X表示你要计算概率的样本。
- Mu:1 x d的向量,表示第i个高斯分布的均值。
- Sigma:d x d的矩阵,表示第i个高斯分布的协方差矩阵。
下面是一个示例代码:
```matlab
% 示例数据
X = [1.2, 2.5; 0.8, 1.6; 2.5, 3.2];
Mu = [1, 2];
Sigma = [2, 0; 0, 1];
% 计算第1个高斯分布的概率
pdf = mvnpdf(X, Mu, Sigma);
prob_i = pdf(1);
disp(['第1个样本在第1个高斯分布的概率为:', num2str(prob_i)]);
```
在上面的代码中,我们给出了三个样本和一个高斯分布的均值和协方差矩阵。我们使用mvnpdf函数计算每个样本在第1个高斯分布中的概率,然后取第1个样本的概率作为第1个高斯分布的概率。
阅读全文