📄 gmm.m
字号:
function value=GMM(centroid,cov,k_all,v)
mindist=0.01;%设置最小的矢量距离
L=30.001;%30times iterate ,with average variation of 0.001 for each iteration.
em_count=0;
[dimen,frame_all]=size(v);
cov_exp=zeros(dimen,16,20);
centroid_exp=zeros(dimen,16,20);
% mix(v,16,5);
th=(L-floor(L))*frame_all;%0.001*frame_all
finalpro=0;
for ii=1:L%em过程L=30次
% divide设置初始点时候只需要根据每个类别聚类就可以了,而下面将进行的高斯模型em过程将会在每个中心 点都与每个点关联 取得p和b的值
em_count=em_count+1;
p=zeros(16,frame_all);
b=zeros(16,frame_all);
k_all=k_all/frame_all;%i类模型出现的概率
for i=1:16
for j=1:frame_all
if sum(abs(centroid(:,i)))~=0
b(i,j)=(abs(prod(cov(:,i))^(-1/2)))*exp(sum((v(:,j)-centroid(:,i)).^2./cov(:,i))*(-1/2));
else
b(i,j)=0;
end
end
end
for i=1:frame_all
b_sum=0;
for j=1:16
b_sum=b_sum+b(j,i)*k_all(j);
end
for j=1:16
if b_sum~=0%防止没有数据的出现
p(j,i)=k_all(j)*b(j,i)/b_sum;
else
p(j,i)=0;
end
end
end
centroid=zeros(dimen,16);
cov=zeros(dimen,16);
p_sum=zeros(16,1);
k_all=zeros(16,1);
%知道了p和b的值,修正centroid, cov 的值和k_all就是p(i)的值
for i=1:16%problem
for j=1:frame_all
centroid(:,i)=centroid(:,i)+p(i,j)*v(:,j);
p_sum(i)=p_sum(i)+p(i,j);
k_all(i)=k_all(i)+p(i,j);
end
k_all(i)=k_all(i)/frame_all;
if p_sum(i)~=0%改过
centroid(:,i)=centroid(:,i)/p_sum(i);
else
centroid(:,i)=0;
end
for j=1:frame_all
if p_sum(i)~=0%改过
cov(:,i)=cov(:,i)+(v(:,j).^2-centroid(:,i).^2)*p(i,j)/p_sum(i);
else
cov(:,i)=0;
end
end
end
for j=1:16
for jj=1:dimen
if cov(jj,j)<mindist
cov(jj,j)=mindist;
end
end
end
cov_exp(:,:,em_count)=cov(:,:);
centroid_exp(:,:,em_count)=centroid(:,:);
finalpro_pre=finalpro;
finalpro=0;
for i=1:frame_all
finalpro=finalpro+sum(b(:,i).*k_all);
end
if finalpro-finalpro_pre<th&&ii>2
break;
end
% zza2
end
value={centroid,cov,k_all};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -