📄 gaosi.m
字号:
*************main.m**********
function main()
format long
panduan = 1;%判断条件
n = 150;%数据个数
k = 3;%分类个数
e = 0.0001;%误差精度
tt=0;%计算迭代的次数
choice = input('请选择要分类的数据包:(1或者2)')
if(choice==1)
m=4;
X = load('data1.m');
elseif(choice==2)
m=2;
X = load('data2.m');
end
choice = input('请选择初始化的Z:(1:理想化的Z;2:随机化的Z)')
if(choice==1)
%任意初始化矩阵
Z = zeros(n,k);%第三类数据错5个数据
for i =1:n
if(i>100)
Z(i,3) = 1;
elseif(i>50)
Z(i,2) = 1;
else
Z(i,1) = 1;
end
end
elseif(choice==2)
Z = load('Z.m');
end
% Z = Z_matrix(n,k);%随机化的Z
% disp((Z))
%初始化E1
U = junzhi(Z,X,m,n,k);
xie = xie_matrix(Z,X,U,m,n,k);
G = Gao(X,U,xie,m,n,k);
for j=1:k
midu(j) = 1/k;
end
temp1 = 0;
for i=1:n
for j=1:k
temp1 = temp1 + midu(j)*G(i,j);
end
p(i) = temp1;
temp1 = 0;
end
for i=1:n
for j=1:k
E1(i,j) = (midu(j)*G(i,j))/p(i);
end
end
%
while(panduan)
temp2 = 0;
for j=1:k
for i=1:n
temp2 = temp2 + E1(i,j);
end
midu(j) = temp2*(1/n);
temp2 = 0;
end
%计算E2
U = junzhi(E1,X,m,n,k);
xie = xie_matrix(E1,X,U,m,n,k);
G = Gao(X,U,xie,m,n,k);
temp1 = 0;
for i=1:n
for j=1:k
temp1 = temp1 + midu(j)*G(i,j);
end
p(i) = temp1;
temp1 = 0;
end
for i=1:n
for j=1:k
E2(i,j) = (midu(j)*G(i,j))/(p(i));
end
end
panduan = (cha(E2,E1,n,k)>e);
E1 = E2;
tt = tt+1;
end
disp(tt)
Z = zeros(n,k);
for i=1:n
xia = 0;
[zhi,xia] = max(E1(i,:));
Z(i,xia) = 1;
for j = 1:k
if(j~=xia)
Z(i,j) = 0;
end
end
end
Out(Z,n,k);
***************junzhi.m**********
function U = junzhi(Z,X,m,n,k)
temp1 = 0;
temp2 = 0;
for j=1:k
for l=1:m
for i=1:n
temp1 = temp1 + Z(i,j)*X(i,l);
temp2 = temp2 + Z(i,j);
end
U(j,l) = temp1/temp2;
temp1 = 0;
temp2 = 0;
end
end
***********Gao.m***********
function G = Gao(X,U,xie,m,n,k)
for i = 1:n
forj=1:k G(i,j)=exp((-1/2).*(X(i,:)-U(j,:))*pinv(xie(:,:,j))*(X(i,:)-U(j,:)).')*1/((2*pi).^(m/2)*sqrt(det(xie(:,:,j))));
end
end
*********xie_matrix********
function xie = xie_matrix(Z,X,U,m,n,k)
temp1 = zeros(m,m);
temp2 = 0;
for j=1:k
for i=1:n
temp1 = temp1 + Z(i,j).*(X(i,:)-U(j,:))'*(X(i,:)-U(j,:));
temp2 = temp2 + Z(i,j);
end
xie(:,:,j) = temp1/temp2;
temp1 = zeros(m,m);
temp2 = 0;
end
*********cha.m*******
function temp = cha(E2,E1,n,k)
temp = 0;
for i=1:n
for j=1:k
temp = temp + abs(E2(i,j) - E1(i,j));
end
end
*********Out.m********
function Out(Z,n,k)
index = 0;
disp('数据的分类如下所示:')
for j = 1:k
for i =1:n
if(Z(i,j)==1)
index = index +1;
shuju(1,index,j) = i;
end
end
disp(j)
disp(shuju(1,:,j))
index = 0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -